我正在开发一个用jsf编程的项目,但是没有持久层,查询在bean中是普通的jdbc。在应用程序启动时,实例化jdbc连接,如果用户存在并写入正确的密码,则将实例化身份验证bean。我的问题是,我不知道如何破坏authentification bean死亡的连接,例如因为超时。我的另一个问题是,如果用户没有点击按钮注销并只是关闭浏览器,我怎么知道应用程序结束了。
答案 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层中分离持久层。它将使其更易于测试,可重复使用和可维护。