【问题标题】:Ant / HSQLDB: Tables not created / foundAnt / HSQLDB:未创建/未找到表
【发布时间】:2014-02-03 08:56:19
【问题描述】:

早安

我想在 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 中提到的参数(例如shutdown=true)。

谢谢

【问题讨论】:

    标签: ant hsqldb


    【解决方案1】:

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

    如果你想使用内存,你需要在你正在运行的 java 进程中初始化它。这不是您可以使用外部 ANT 脚本执行的操作。您还应该确保不要关闭最后一个连接,或者关闭该功能(DB_CLOSE_DELAY=-1)。这也应该在同一个 ANT Job (=JVM) 中工作。您还应该使用命名的内存实例,以便所有 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".
    

    【讨论】:

      猜你喜欢
      • 2015-04-28
      • 2016-01-26
      • 1970-01-01
      • 1970-01-01
      • 2013-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多