2016-03-06 38 views
1

我試圖運行從Java到PosgresSQL查詢和我從stmt.execute(sql)如何防止事務關閉在catch(例外e)?

一個錯誤,我想執行一個新的查詢,幫我打印出特定的行失敗,但是當我到達catch (Exception e)交易被中止。

我不能創建一個新的事務,因爲我正在使用臨時表。如何防止交易中止?

org.postgresql.util.PSQLException: ERROR: current transaction is aborted, commands ignored until end of transaction block

try (Statement stmt = data.db.getConnection().createStatement()) { 
     // data.db.getConnection().setSavepoint("sp01"); 
     // insert to fact table 
     TableSchema factTableSchema = factInfo.getTableSchema(); 
     // build SQL 
     String sql = "Select * From...."; 
     try { 
      stmt.execute(sql); // this row is failing 
     } 
     catch (Exception e) { 
      try { 
     // now i would like to run a query only in case arrived here, but the transaction is closed 
         // how could i prevent from trasanction to close ? 
       ResultSet rs = stmt.executeQuery(" SELECT Bla,Bla From.."); 
       Log.debug(""); 
      } 
      catch (Exception e2) { 
       Log.debug(""); 
      } 
     } 
+0

創建一個新的聲明。 –

+0

你會得到什麼異常,因爲'select'通常不會導致異常,除非你有語法錯誤。請注意,PostgreSQL在錯誤時中止事務,除了啓動新的事務外,沒有恢復。 –

+0

第一個例外是整數超出範圍。 – 2Big2BeSmall

回答

1

在第二個try塊創建一個新的語句執行查詢之前。

Statement stmt = data.db.getConnection().createStatement(); 
ResultSet rs = stmt.executeQuery(" SELECT Bla,Bla From.."); 

ResultSet需要連接而活着執行next();

+1

這隻有在您處於自動提交模式時纔有效。 –

+1

你必須在查詢中提交什麼? – m4heshd

+1

即使對於查詢,您也需要事務才能獲得正確的可視性保證。在JDBC中你有自動提交,或者你禁用自動提交,然後程序員通過顯式調用commit或rollback來決定事務結束。 –