早上好
我想在ant构建期间生成数据库文档。因此,我启动HSLQDB(版本2.3.0)并从单元测试期间生成的转储初始化它。我是这样做的:
<property name="database.name" value="testdb" />
<property name="database.url.cache" value="jdbc:hsqldb:hsql://localhost:9001/testdb;sql.syntax_ora=true" />
<echo message="- hsqldb initialize -" />
<java classname="org.hsqldb.Server" fork="true" spawn="true" classpathref="db.classpath">
<arg value="-database.0"/>
<arg value="file:${database.dir}/${database.name}"/>
<arg value="-dbname.0"/>
<arg value="${database.name}"/>
<arg value="-port"/>
<arg value="9001"/>
</java>
<property name="jdbc.driver" value="org.hsqldb.jdbcDriver" />
<property name="database.username" value="sa" />
<property name="database.password" value="" />
<sql
classpathref="db.classpath"
driver="${jdbc.driver}"
url="${database.url.cache}"
userid="${database.username}" password="${database.password}"
autocommit="true">
SET DATABASE SQL SYNTAX ORA TRUE;
</sql>
只要在本地运行,这就完美无缺。但是在构建服务器上,我不允许打开任何端口(既不执行任何可能挂起的jar并且搞乱后续构建)。因此,我想启动HSQLDB inmemory,这是通过设置
来完成的-address jdbc:hsqldb:mem:testdb
当然,这会导致模式被删除,因为文件被忽略了。但是当我将任何表插入到内存数据库中时:
<sql
classpathref="db.classpath"
driver="${jdbc.driver}"
url="${database.url.cache}"
userid="${database.username}" password="${database.password}"
autocommit="true" src="anydir/anyfile.sql">
</sql>
anyfile.sql:
CREATE TABLE test (ID DECIMAL(19) NOT NULL PRIMARY KEY, TESTME VARCHAR2(255));
......没有任何反应。当我查询数据库时,没有可用的表:
<sql
classpathref="db.classpath"
driver="${jdbc.driver}"
url="${database.url.cache}"
userid="${database.username}" password="${database.password}"
autocommit="true">
SCRIPT 'anydir/hsqldb.dump';
</sql>
模式PUBLIC中根本没有表,这意味着它是一个新的数据库......
我做错了什么?我已经尝试了提到here的params(例如shutdown = true)。
谢谢
答案 0 :(得分:0)
&#34;不是服务器&#34;和#34;在记忆中&#34;。您可以在内存数据库中运行服务器,也可以不使用文件变体运行服务器。但是,如果可能的话,尝试在内存中进行测试是一件好事。您可以避免清理,而且速度更快。
如果要使用内存,则需要在运行的java进程中初始化它。这不是你可以用外部ANT脚本做的事情。您还应该确保不关闭最后一个连接,或者关闭该功能(DB_CLOSE_DELAY = -1)。这也应该在同一个ANT作业(= JVM)中工作。您还应该使用命名的mem实例,以便所有ant任务在同一内存区域中相遇。
我有unit test使用Flyway初始化内存H2并运行测试,初始化程序如下:
JdbcDataSource ds = new JdbcDataSource();
ds.setUser("VFSTEST");
ds.setPassword("secret");
// make sure "mem" database is not anonymous and
// will not get dropped on connection close
ds.setURL("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;JMX=TRUE");
Flyway flyway = new Flyway();
flyway.setDataSource(ds);
flyway.setLocations("db/migration/h2_derby");
flyway.setValidateOnMigrate(true);
flyway.setCleanOnValidationError(true);
flyway.migrate();
// now use "ds".