什么时候破坏数据库连接?

时间:2011-02-16 07:15:02

标签: java jsf jdbc

我正在开发一个用jsf编程的项目,但是没有持久层,查询在bean中是普通的jdbc。在应用程序启动时,实例化jdbc连接,如果用户存在并写入正确的密码,则将实例化身份验证bean。我的问题是,我不知道如何破坏authentification bean死亡的连接,例如因为超时。我的另一个问题是,如果用户没有点击按钮注销并只是关闭浏览器,我怎么知道应用程序结束了。

2 个答案:

答案 0 :(得分:3)

使用connection pool进行严格考虑。它会让你的生活更轻松:) 例如,当您对用户进行身份验证时,只需从池中获取连接,进行验证然后关闭连接,然后将其返回到池中。

答案 1 :(得分:1)

  

在apllication启动时,实例化jdbc连接

这是错误的做法。应该在创建和执行语句并收集结果的同一块try块中打开连接。必须在此finally块的try块中关闭连接(以及语句和结果集)。

如果发生这种情况并且/或者当DB服务器决定使连接超时时,不这样做可能会导致资源泄漏和意外(和不期望的)应用程序行为,因为它已被应用程序保持打开状态太长时间。

以下是基本的JDBC习语:

Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;

try {
    connection = database.getConnection();
    statement = connection.prepareStatement(SOME_SQL);
    resultSet = statement.executeQuery();
    // ...
} finally {
    if (resultSet != null) try { resultSet.close(); } catch (SQLException ignore) {}
    if (statement != null) try { statement.close(); } catch (SQLException ignore) {}
    if (connection != null) try { connection.close(); } catch (SQLException ignore) {}
}

要提高连接性能,您始终可以使用连接池,但更改try-finally块中最短范围内获取和关闭资源的基本JDBC习惯用法。最体面的servletcontainer / applicationservers附带内置连接池设施。只要不清楚你正在使用哪一个,就不可能给出一个非常合适的答案。

那就是说,我仍然强烈建议从MVC层中分离持久层。它将使其更易于测试,可重复使用和可维护。

另见: