【问题标题】:Why we should close the connection in JDBC? If we don't do it, what will happen为什么我们应该关闭 JDBC 中的连接?如果我们不这样做,会发生什么
【发布时间】:2014-11-09 22:26:46
【问题描述】:

在java中与数据库通信,我们经常按照以下步骤进行:

  1. 加载驱动程序
  2. 建立连接
  3. 创建一个声明或PreparedStatement
  4. 获取ResultSet
  5. 关闭连接

我很困惑我们应该关闭连接,都说创建连接很昂贵,所以我们为什么不能这样做:

static
    {
        try
        {
            connection = DriverManager.getConnection(connectorURL,
                    user, password);
        } catch (SQLException e)
        {
            e.printStackTrace();
        }
    }

我们只是将连接创建为单例,并在任何地方使用它。不能吗?如果我这样使用,会发生什么?

如果我不关闭连接,会发生什么?

另外,我们将使用连接池,它会在池中创建一些连接,我们从池中获取连接,池中的连接也不会关闭,为什么如果我们不使用池,如果我们不使用,我们需要按照步骤关闭连接吗?

很迷茫,不知道原理是什么。请帮我。谢谢。

【问题讨论】:

  • 即使在使用连接池时,您也必须关闭连接:这向连接池发出信号,表示它可以重用。您存储在静态变量中的解决方案非常糟糕:它可能会导致各种难以调试的并发问题。如果您担心创建连接的成本,那么您应该使用连接池,而不是通过DriverManager 创建连接。
  • 你可以做你写的,但连接不是线程安全的,所以它没有意义,除非你也打算引入同步,作为一种治疗方法比疾病更糟糕。最好使用线程池给您一个Connection 作为局部变量,并在方法退出时将其关闭以将其返回到池中。如果您不关闭它,它会泄漏并占用服务器资源。
  • @EJP 连接本身可能是线程安全的(JDBC 要求),但使用该连接的应用程序可能不是线程安全的。想想不同的事务隔离、边界(提交/回滚/自动提交)等。

标签: jdbc connection database-connection connection-pooling


【解决方案1】:

如果我们不关闭连接,会导致连接内存泄漏。在应用程序服务器/Web 服务器关闭之前,即使用户注销,连接仍将保持活动状态。

还有其他原因。假设数据库服务器有 10 个可用连接,并且有 10 个客户端请求连接。如果数据库服务器授予所有这些,并且在使用后它们没有关闭,则数据库服务器将无法为另一个请求提供任何其他连接。出于这个原因,我们需要关闭它们 - 这是强制性的。

此外,它可能会导致一些关于数据库完整性的恶作剧。

【讨论】:

    【解决方案2】:

    我们只是将连接创建为单例,并在任何地方使用它。不能吗?如果我这样使用,会发生什么?

    在这种情况下,您将只有一个数据库连接。如果数据库查询的执行时间较长,则对该连接对象的其他请求将不得不等待。所以,这不是推荐的方法。

    如果我不关闭连接,会发生什么?

    通过关闭连接,StatementResultSet 的对象将自动关闭。 close() 方法用于关闭连接。如果您忘记这样做,它将导致您的应用程序连接内存泄漏。例如:假设您的应用程序有 10 个数据库连接,并且同时有 10 个用户处于活动状态。后来,有 3 个用户退出了应用程序,但是由于您没有实现连接关闭机制,这 3 个连接仍然处于活动状态,因此,您的应用程序不会向其他用户提供任何其他连接。此外,数据库服务器中打开的连接数量增加会降低应用程序的速度。所以,立即释放Connection对象的数据库和JDBC资源,而不是等待它们被自动释放。

    另外,我们将使用连接池,它会在池中创建一些连接,我们从池中获取连接,池中的连接也不会关闭,为什么如果我们不使用池,如果我们不使用,我们需要按照步骤关闭连接吗?

    连接池意味着连接被重用,而不是在每次请求连接时都创建。

    This source 说:“如果系统提供连接池,则查找从池中返回一个可用的连接(如果有可用的连接)。如果系统不提供连接池或池中没有可用的连接,查找创建一个新连接。应用程序从连接重用中受益,而无需任何代码更改。池中重用的连接的行为方式与新创建的物理连接相同。应用程序与数据库建立连接,数据访问以通常的方式工作. 当应用程序完成连接的工作后,应用程序会显式关闭连接。

    池连接上的关闭事件向池模块发出信号,将连接放回连接池以供将来重用。”

    您的应用程序从池中借用一个连接,使用它,然后通过关闭它将其返回到池中。空闲池中长时间的连接不被视为问题。

    【讨论】:

    • By closing the connection, objects of Statement and ResultSet will be closed automatically 不是每个 RDBMS 都能做到这一点...
    猜你喜欢
    • 2013-04-12
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    相关资源
    最近更新 更多