2012-04-22 92 views
2

我正在使用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

回答

1

由於代碼在調試時工作,所以問題必須在此代碼之外。

如果您將此代碼作爲文件:數據庫的隔離測試運行,並且您沒有在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