Ant/HSQLDB:未创建/找到表

Ant/HSQLDB:未创建/找到表,ant,hsqldb,Ant,Hsqldb,早上好 我想在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" /> &l

早上好

我想在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>
当然,这会终止模式,因为文件被忽略。但当我使用以下命令将任何表插入inmemory数据库时:

<sql 
   classpathref="db.classpath" 
   driver="${jdbc.driver}" 
   url="${database.url.cache}" 
   userid="${database.username}" password="${database.password}" 
   autocommit="true" src="anydir/anyfile.sql">
</sql>
……什么也没发生。查询数据库时,没有可用的表:

<sql 
   classpathref="db.classpath" 
   driver="${jdbc.driver}" 
   url="${database.url.cache}" 
   userid="${database.username}" password="${database.password}" 
   autocommit="true">
   SCRIPT 'anydir/hsqldb.dump';
</sql>

脚本'anydir/hsqldb.dump';
在公共模式中根本没有表,这意味着它是一个新的数据库

我做错了什么?我已经试过上面提到的参数(例如shutdown=true)


谢谢

在“非服务器”和“内存中”之间没有关系。您可以在内存数据库上运行服务器,也可以不运行带有文件变量的服务器。然而,如果可能的话,尝试在内存中使用它进行测试是一件好事。您无需进行清理,而且清理速度更快

如果要在内存中使用,则需要从正在运行的java进程中初始化它。这不是使用外部ANT脚本可以做到的。您还应该确保没有关闭最后一个连接,或者关闭该功能(DB_close_DELAY=-1)。这也应该在相同的ANT作业(=JVM)中工作。您还应该使用一个命名的mem实例,以便所有ant任务在同一内存区域中相遇

我有一个正在使用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".
<sql 
   classpathref="db.classpath" 
   driver="${jdbc.driver}" 
   url="${database.url.cache}" 
   userid="${database.username}" password="${database.password}" 
   autocommit="true">
   SCRIPT 'anydir/hsqldb.dump';
</sql>
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".