Play框架:关闭JDBC连接

时间:2014-06-12 12:11:14

标签: java database jdbc playframework

是否需要在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();

3 个答案:

答案 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
}

答案 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
}

请参见Documentation