将HSQLDB与SQL Maven插件和jOOQ一起使用
这是一个类似的问题,如使用Flyway的嵌入式数据库和Maven中的jOOQ进行持续集成 ,尽管与我们使用的是sql-maven-plugin
并不完全相同,而不是Flyway。
以下Maven插件配置失败:
SQL-Maven的插件
org.codehaus.mojo sql-maven-plugin 1.5 create-database generate-sources execute ${db.driver} ${db.url} ${db.username} ${db.password} src/main/resources/sql/create-db.sql org.hsqldb hsqldb ${hsqldb.version}
jooq-CODEGEN,行家
org.jooq jooq-codegen-maven ${jooq.version} generate-hsqldb generate-sources generate ${db.driver} ${db.url} ${db.username} ${db.password} PUBLIC com.example.db target/generated-sources/jooq-hsqldb
错误是:
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.(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)
如何解决这个问题呢?
正如其他问题所解释的那样,jofQ与Flyway一起使用时 ,HSQLDB在类加载器的基础上锁定数据库存在问题。 这里涉及的两个maven插件不共享相同的类加载器,因此第二个插件无法访问第一个类加载器嵌入的数据库,除非:
- 在第一个脚本中调用
SHUTDOWN IMMEDIATELY
(但这有点难看,因为在其他上下文中也可能需要脚本) - JVM被关闭(但在Maven的上下文中这非常难看)
解决方法是指定sql-maven-plugin
的第二次执行,它显式调用SHUTDOWN IMMEDIATELY
命令:
create-database generate-sources ... shutdown-database generate-sources execute ${db.driver} ${db.url} ${db.username} ${db.password} SHUTDOWN IMMEDIATELY