2014-06-12 80 views
0

是否需要在Play中手動關閉數據庫連接(JDBC)?每個請求之後的框架(2.3.0)?播放框架:關閉JDBC連接

這裏的例子只是做了DB.getConnection(),並沒有說任何有關關閉連接:http://www.playframework.com/documentation/2.3.x/JavaDatabase

所以我假設做一個DB.getConnection()爲每個GET/POST請求是可以接受的,我不需要關閉任何東西。怎麼樣的SQL語句?

conn = ds.getConnection(); 
stmt = conn.createStatement(); 
stmt.execute("SOME SQL QUERY"); 
stmt.close(); 

回答

2

如果你仔細閱讀文檔你看到他們確實回答你的第一個問題:

重要的是要注意,結果連接不會自動di在請求週期結束時出現。換句話說,你有責任在你的代碼的某個地方調用它們的close()方法,以便它們可以立即返回到池中。

關於SQL語句我猜你不必明確地關閉它。在Javadoc中Connection.close()他們說:

立即釋放此Connection對象的數據庫和JDBC資源,而不是等待它們被自動釋放。

如果我理解正確此的Connection.close()也應釋放資源的聲明...

+0

不知道我怎麼錯過了。謝謝。 –

3

這可能是一個非常糟糕的假設,具體取決於您的數據庫供應商。

連接是稀缺資源,包含客戶端和數據庫服務器組件。客戶端上的垃圾回收器可以清理Connection對象,但不會通知服務器連接已關閉。您很快就會在服務器端耗盡連接,因爲它們是有限的資源。 (在服務器端的光標)StatementResultSet相同。

更好的解決方案是使用JDBC連接池分攤創建連接的成本,並在完成時管理關閉它們。

你也應該關閉在finally塊你的SQL資源,包裹在個別try/catch塊:

public class DatabaseUtils { 

    private DatabaseUtils() {} 

    // Similar for Statement and ResultSet 
    public static void close(Connection c) { 
     try { 
      if (c != null) { 
       c.close(); 
      } 
     } catch { Exception e) { 
      log.error(e); 
     } 
    } 
} 

並在代碼:

Connection c = null; 
try { 
    c = ds.getConnection();  
    // Do something with the connection 
} finally { 
    DatabaseUtils.close(c); // same for Statement and ResultSet 
}