gpt4 book ai didi

java - 将 HSQLDB 与 SQL Maven 插件和 jOOQ 结合使用

转载 作者:行者123 更新时间:2023-12-02 04:17:49 25 4
gpt4 key购买 nike

这是一个类似的问题,如 Using embedded database with Flyway and jOOQ in Maven for continuous integration ,尽管与我们使用的 sql-maven-plugin 不完全相同,而不是 Flyway。

以下 Maven 插件配置失败:

sql-maven-插件

<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>sql-maven-plugin</artifactId>
<version>1.5</version>

<executions>
<execution>
<id>create-database</id>
<phase>generate-sources</phase>
<goals>
<goal>execute</goal>
</goals>
<configuration>
<driver>${db.driver}</driver>
<url>${db.url}</url>
<username>${db.username}</username>
<password>${db.password}</password>
<srcFiles>
<srcFile>src/main/resources/sql/create-db.sql</srcFile>
</srcFiles>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>${hsqldb.version}</version>
</dependency>
</dependencies>
</plugin>

jooq-codegen-maven

<plugin>
<groupId>org.jooq</groupId>
<artifactId>jooq-codegen-maven</artifactId>
<version>${jooq.version}</version>

<executions>
<execution>
<id>generate-hsqldb</id>
<phase>generate-sources</phase>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<jdbc>
<driver>${db.driver}</driver>
<url>${db.url}</url>
<user>${db.username}</user>
<password>${db.password}</password>
</jdbc>
<generator>
<database>
<inputSchema>PUBLIC</inputSchema>
</database>
<target>
<packageName>com.example.db</packageName>
<directory>target/generated-sources/jooq-hsqldb</directory>
</target>
</generator>
</configuration>
</execution>
</executions>
</plugin>

错误是:

java.sql.SQLException: Database lock acquisition failure: lockFile: org.hsqldb.persist.LockFile@cc76d81d[file =C:\Users\Lukas\example.db.lck, exists=true, locked=false, valid=false, ] method: checkHeartbeat read: 2015-10-14 10:49:15 heartbeat - read: -9975 ms.
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCConnection.<init>(Unknown Source)
at org.hsqldb.jdbc.JDBCDriver.getConnection(Unknown Source)
at org.hsqldb.jdbc.JDBCDriver.connect(Unknown Source)
at org.jooq.util.GenerationTool.run(GenerationTool.java:208)
at org.jooq.util.GenerationTool.generate(GenerationTool.java:180)
at org.jooq.util.maven.Plugin.execute(Plugin.java:131)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:132)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:120)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:347)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:154)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:582)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:214)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:158)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)

如何解决这个问题?

最佳答案

As explained in that other question, where jOOQ is used with Flyway ,HSQLDB 在类加载器的基础上锁定数据库存在问题。这里涉及的两个maven插件不共享相同的类加载器,因此第二个插件无法访问第一个类加载器嵌入的数据库,除非:

  • SHUTDOWN IMMEDIATELY 在第一个脚本中调用(但这有点难看,因为其他上下文中也可能需要该脚本)
  • JVM 已关闭(但这在 Maven 上下文中非常难看)

解决方法是指定对 sql-maven-plugin 进行第二次执行,该命令显式调用 SHUTDOWN IMMEDIATELY 命令:

<execution>
<id>create-database</id>
<phase>generate-sources</phase>
...
</execution>

<execution>
<id>shutdown-database</id>
<phase>generate-sources</phase>
<goals>
<goal>execute</goal>
</goals>
<configuration>
<driver>${db.driver}</driver>
<url>${db.url}</url>
<username>${db.username}</username>
<password>${db.password}</password>

<sqlCommand>SHUTDOWN IMMEDIATELY</sqlCommand>
</configuration>
</execution>

关于java - 将 HSQLDB 与 SQL Maven 插件和 jOOQ 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33123477/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com