HSQLDB:我试图从临时表中填充一些数据,但数据正在被删除

HSQLDB:我试图从临时表中填充一些数据,但数据正在被删除

问题描述:

我正在使用HSQLDB。在一个java函数内部,我创建了一个临时表并用一些数据填充它。在我用临时表中的数据更新常规表格之后。HSQLDB:我试图从临时表中填充一些数据,但数据正在被删除

如果我调试函数内部的代码并执行SELECT我可以看到数据确实在两个表中都有更新,但在提交更改之后表不再更新! (常规表格,而不是临时表格)。

当我创建我使用的临时表:ON COMMIT PRESERVE ROWS但它没有帮助。

有谁知道为什么会发生这种情况?

谢谢!

下面是代码:

public synchronized void foo(String[] objectsToMark) throws Exception { 

     String createTempTableQuery = "CREATE TEMP TABLE "+TEMP_TABLE_NAME+"(OBJECTID VARCHAR) " + 
       "ON COMMIT PRESERVE ROWS"; 
     String dropTempTableQuery = "DROP TABLE "+TEMP_TABLE_NAME; 

     String updateQueryString = "update " + TABlE_A + " set " +TABlE_A+".X = 'N' where "+TABlE_A+".RESULT_ID in (select "+TABlE_A+".RESULT_ID FROM "+TABlE_A 
         +" inner join "+TABLE_B+" on "+TABLE_B+".OBJECTID = "+TABlE_A+".OBJECTID" 
         +" inner join TEMP_TABLE on "+TABLE_B+".OBJECTID = TEMP_TABLE.OBJECTID" 
         +" where "+TABlE_A+".IS_X = 'Y')"; 

     String insertObjectIDs = "INSERT INTO " + TEMP_TABLE_NAME + " (OBJECTID) VALUES (?)"; 
     Connection conn = null; 
     Statement stmt = null; 
     PreparedStatement psInsertObjectIDs = null; 
     try { 
      conn = getConnection(getClass().getName() + ""); 
      stmt = conn.createStatement(); 


      stmt.execute(createTempTableQuery); 

      // insert object's IDs into table 
      psInsertObjectIDs = conn.prepareStatement(insertObjectIDs); 

      for (String id : objectsToMark) { 
       int i = 0; 
       psInsertObjectIDs.setString(++i, id); 
       psInsertObjectIDs.addBatch(); 
      } 
      psInsertObjectIDs.executeBatch(); 

      stmt.execute(updateQueryString); 

     } catch (Exception e) { 
     } finally { 
      // close resources 
      close(stmt); 
      stmt = null; 
      // drop the temporary tables 
      if (conn != null) { 
       try { 
        stmt = conn.createStatement(); 
        stmt.execute(dropTempTableQuery); 
       } catch (SQLException e) { 
       } 
       close(stmt); 
      } 

      close(psInsertObjectIDs); 
      closeConnection(conn); 
     } 
    } 

注意,有没有犯在这里,但连接被配置为执行自动提交。

+0

请举报代码! – fredt 2012-04-22 20:05:02

由于代码在调试时工作,所以问题必须在此代码之外。

如果您将此代码作为文件:数据库的隔离测试运行,并且您没有在jdbc连接url中指定写入延迟或关闭选项,则引擎没有足够的时间将数据写入磁盘。

HSQLDB的默认设置用于生产,其中SHUTDOWN由应用程序发出。对于测试,请使用以下任一属性。

以后每次提交或自动提交这个人写的变化,因此降低了生产数据库:

jdbc:hsqldb:file:mydb;hsqldb.write_delay=false 

这一次关闭时仅剩的唯一连接被关闭数据库:

jdbc:hsqldb:file:mydb;shutdown=true 

由于这个问题经常出现,来自2.2.9的未来版本的HSQLDB将在剩下的唯一连接关闭时始终将数据写入磁盘。

+0

它有帮助,非常感谢 – axelrod 2012-05-01 07:50:10

+0

数据存储在哪里?我找不到它,只有一个空的文件夹'db.tmp'。 – zygimantus 2016-09-18 19:59:16

+0

TEMP表的数据存储在内存中。会话设置允许更大的TEMP表存储在.tmp目录内的文件中。看指南。 – fredt 2016-09-19 10:42:18