2014-06-12 77 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 
}