是否需要在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();
答案 0 :(得分:3)
这可能是一个非常糟糕的假设,具体取决于您的数据库供应商。
连接是稀缺资源,包括客户端和数据库服务器组件。客户端上的垃圾收集器当然可以清理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
}
答案 1 :(得分:2)
如果您仔细阅读文档,则会看到他们确实回答了您的第一个问题:
请务必注意,在请求周期结束时不会自动处理生成的连接。换句话说,您负责在代码中的某处调用close()方法,以便它们可以立即返回到池中。
关于SQL语句,我猜你不必显式关闭它。在Connection.close()的Javadoc中,他们说:
立即释放此Connection对象的数据库和JDBC资源,而不是等待它们自动释放。
如果我理解正确,Connection.close()也应该释放Statement资源......
答案 2 :(得分:0)
Scala (使用 Play 2.6 进行了测试)有一种更优雅的方式:
但是,当然,您需要在打开的某个时刻调用close() 连接以将其返回到连接池。 另一种方法是让 播放管理为您关闭连接:
// access "default" database
db.withConnection { conn =>
// do whatever you need with the connection
}