为什么我们应该在JDBC中关闭连接?如果我们不这样做,会发生什么

问题描述 投票:3回答:2

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

  1. 加载驱动程序
  2. 得到一个连接
  3. 创建一个Statement或PreparedStatement
  4. 得到ResultSet
  5. 关闭连接

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

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

我们只是创建一个单独的连接,并在任何地方使用它。不是吗?如果我像这样使用它会发生什么?

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

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

它太混乱了,我不知道原理是什么。请帮我。谢谢。

jdbc connection database-connection connection-pooling
2个回答
5
投票

如果我们不关闭连接,将导致连接内存泄漏。除非/直到应用程序服务器/ Web服务器关闭,否则即使用户注销,连接仍将保持激活状态。

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

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


0
投票

我们只是创建一个单独的连接,并在任何地方使用它。不是吗?如果我像这样使用它会发生什么?

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

如果我不关闭连接,会发生什么?通过关闭连接,Statement和ResultSet的对象将自动关闭。 close()方法用于关闭连接。如果您忘记这样做,那么它将导致您的应用程序连接内存泄漏。例如:如果您的应用程序具有10个数据库连接,并且10个用户在时间实例上处于活动状态。之后,3个用户从应用程序注销,但由于您未在此处实现连接关闭机制,因此这3个连接将保持活动状态。您的应用不会为新用户提供新的连接。所以增加了没有。数据库服务器中的打开连接将减慢应用程序。因此,立即释放Connection对象的数据库和JDBC资源,而不是等待它们自动释放。

另外,我们将使用连接池,它将在池中创建一些连接,并且我们从池中获取连接,池中的连接也不关闭,为什么如果我们不使用池,我们需要关注如果我们不使用步骤并关闭连接?连接池意味着每次请求连接时都会重用连接而不是创建连接。

“如果系统提供连接池,则查找将返回池中的连接(如果有可用)。如果系统未提供连接池,或者池中没有可用连接,则查找将创建新连接。来自连接重用而不需要任何代码更改。来自池的重用连接的行为与新创建的物理连接的行为相同。应用程序建立与数据库的连接,数据访问以通常的方式工作。当应用程序完成其工作时连接,应用程序显式关闭连接

池化连接上的关闭事件表示池化模块将连接放回连接池中以供将来重用。“

_source:https://www.progress.com/tutorials/jdbc/jdbc-jdbc-connection-pooling

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

© www.soinside.com 2019 - 2024. All rights reserved.