[英]Play framework: closing JDBC connection
是否需要在Play中手动关闭数据库连接(JDBC)! 框架(2.3.0)后的每个请求?
此处的示例仅执行DB.getConnection(),而未说明关闭连接的方法: http ://www.playframework.com/documentation/2.3.x/JavaDatabase
所以我假设对每个GET / POST请求执行一个DB.getConnection()是可以接受的,并且我不需要关闭任何东西。 sql语句呢?
conn = ds.getConnection();
stmt = conn.createStatement();
stmt.execute("SOME SQL QUERY");
stmt.close();
这可能是一个非常糟糕的假设,具体取决于您的数据库供应商。
连接是客户端和数据库服务器组件的稀缺资源。 客户端上的垃圾收集器当然可以清理Connection
对象,但这不会通知服务器连接已关闭。 您很快就会用完服务器端的连接,因为它们是有限的资源。 与Statement
和ResultSet
相同(服务器端的光标)。
更好的解决方案是使用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
}
如果仔细阅读文档,您会发现它们确实回答了您的第一个问题:
重要的是要注意,结果连接不会在请求周期结束时自动处理。 换句话说,您有责任在代码中的某个位置调用它们的close()方法,以便可以将它们立即返回到池中。
关于SQL语句,我想您不必显式关闭它。 在Javadoc中的Connection.close()中,他们说:
立即释放此Connection对象的数据库和JDBC资源,而不是等待它们自动释放。
如果我正确理解这一点,Connection.close()也应该释放Statement资源。
Scala有一种更优雅的方式(已通过Play 2.6测试):
但是,当然,您需要在打开的连接上的某个时刻调用close(),以将其返回到连接池。 另一种方法是让Play管理为您关闭连接:
// access "default" database
db.withConnection { conn =>
// do whatever you need with the connection
}
请参阅文档
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.