【问题标题】:When destroy the database connection?什么时候破坏数据库连接?
【发布时间】:2011-02-16 07:15:02
【问题描述】:

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

【问题讨论】:

    标签: java jsf jdbc


    【解决方案1】:

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

    【讨论】:

    • 你能给我一个例子或链接吗?
    • 我无法关闭连接,它将用于查询
    • 关键是你没有一个你保持的全局连接。当您需要连接时,您只需从池中获取它,并在您准备好当前操作后立即返回它。
    • 您将在应用服务器中注册连接池,然后您将通过 JNDI 查找数据源。之后,您会从数据源获得连接。
    • 这里是一个简单的获取连接的类:stackoverflow.com/questions/1915992/…
    【解决方案2】:

    在应用程序开始时,jdbc 连接被实例化

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

    不这样做可能会导致资源泄漏和意外(和不希望的)应用程序行为发生这种情况和/或当数据库服务器决定超时连接时,因为它被您的应用程序保持打开的时间过长。

    以下是基本的 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) {}
    }
    

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

    也就是说,我仍然强烈建议将持久层与 MVC 层分离。它将使其更好地可测试、可重用和可维护。

    另见:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-08
      • 2013-04-25
      • 2014-09-14
      • 1970-01-01
      • 2021-08-03
      • 2011-03-04
      相关资源
      最近更新 更多