2013-04-10 65 views
1

我一直在學習如何在Java中使用Oracle使用Oracle JDBC,我試圖進入try/catch和池清理的思維模式。在Java中處理SQL連接池清理和錯誤處理的正確方法是什麼?

我想知道如果下面的代碼是完全清理所有東西的正確方法,或者你在我的代碼中發現了需要我錯過的東西的漏洞。爲了記錄,我打算使用InnoDB及其行鎖定機制,這就是爲什麼我關閉自動提交。

try 
{ 
    connection = getConnection(); // obtains Connection from a pool 

    connection.setAutoCommit(false); 

    // do mysql stuff here 
} 
catch(SQLException e) 
{ 
    if(connection != null) 
    { 
     try 
     { 
      connection.rollback(); // undo any changes 
     } 
     catch (SQLException e1) 
     { 
      this.trace(ExtensionLogLevel.ERROR, e1.getMessage()); 
     } 
    } 
} 
finally 
{ 
    if(connection != null) 
    { 
     try 
     { 
      if(!connection.isClosed()) 
      { 
       connection.close(); // free up Connection so others using the connection pool can make use of this object 
      } 
     } 
     catch (SQLException e) 
     { 
      this.trace(ExtensionLogLevel.ERROR, e.getMessage()); 
     } 
    } 
} 

getConnection()從池中返回一個Connection對象,並connection.close()關閉它釋放回池中(所以我一直在說,還是新來這個如此道歉,如果我說廢話)。任何這方面的幫助將不勝感激!

謝謝!

+0

行爲良好的連接池實現將在您調用Connection.close()時爲您執行所有必需的清理。 – 2013-04-10 14:47:09

回答

1

我建議不要在finally塊中將autocommit設置爲true - 其他依賴於autocommit被設置爲true的線程不應該假定池中的連接處於此狀態,而是應該將autocommit設置爲在使用連接之前爲true(就像此線程將autocommit設置爲false一樣)。

另外,您應該在調用close()之前檢查連接的isClosed屬性。

除此之外,我沒有看到任何問題。

+0

進行了更新,你會說這看起來像點嗎? – xLite 2013-04-10 00:49:11

+1

是的,看起來不錯 – 2013-04-10 00:52:50

+0

非常感謝,謝謝! – xLite 2013-04-10 00:53:20

相關問題