在java中与数据库通信,我们经常按照以下步骤操作:
PreparedStatement
ResultSet
我很困惑,我们应该关闭连接,都说创建连接很昂贵,所以为什么我们不能这样做:
static
{
try
{
connection = DriverManager.getConnection(connectorURL,
user, password);
} catch (SQLException e)
{
e.printStackTrace();
}
}
我们只是创建一个单独的连接,并在任何地方使用它。不是吗?如果我像这样使用它会发生什么?
如果我不关闭连接,会发生什么?
另外,我们将使用连接池,它会在池中创建一些连接,并且我们从池中获取连接,池中的连接也不关闭,为什么如果我们不使用池,如果我们不使用,我们需要按照步骤关闭连接吗?
它很混乱,我不知道原理是什么。请帮我。感谢。
答案 0 :(得分:5)
如果我们不关闭连接,将导致连接内存泄漏。除非/直到应用程序服务器/ Web服务器关闭,否则即使用户注销,连接也将保持激活状态。
还有其他原因。假设数据库服务器有10个可用连接,10个客户端请求连接。如果数据库服务器授予所有这些服务器,并且在使用它们之后它们没有关闭,则数据库服务器将无法为另一个请求提供连接。出于这个原因,我们需要关闭它们 - 这是强制性的。
此外,它可能会导致一些关于数据库完整性的恶作剧活动。
答案 1 :(得分:0)
我们只是将连接创建为单例,并在各处使用它。可以吗如果我这样使用它,会发生什么?
在这种情况下,您将只有一个database_connection。如果数据库查询的执行时间较长,则该连接对象的其他请求必须等待。因此,这不是推荐的方法。
如果我不关闭连接,会发生什么? 通过关闭连接,Statement和ResultSet的对象将自动关闭。 close()方法用于关闭连接。如果您忘记这样做,那么它将导致您的应用程序连接内存泄漏。例如:如果您的应用程序有10个数据库连接,并且某个时间实例上有10个用户处于活动状态。之后,有3个用户从应用程序注销,但是由于您此处未实现连接关闭机制,因此这3个连接将保持活动状态。您的应用不会为新用户提供新连接。所以增加了。数据库服务器中打开连接的数量会使应用程序变慢。因此,立即释放Connection对象的数据库和JDBC资源,而不是等待它们自动释放。
此外,我们将使用连接池,它将在池中创建一些连接,并且我们从池中获得连接,池中的连接也不会关闭,为什么不这样做使用池,如果不使用,我们需要按照以下步骤操作并关闭连接吗? 连接池意味着重新使用连接,而不是每次请求连接时都创建连接。
”如果系统提供了连接池,则查找从池中返回一个连接(如果有连接的话)。如果系统不提供连接池或池中没有可用的连接,则查找将创建一个新的连接。应用程序可从连接重用中受益,而无需进行任何代码更改。池中重用的连接的行为与新创建的物理连接相同。应用程序与数据库建立连接,并且数据访问以通常的方式进行。使用连接,应用程序会明确关闭连接
池化连接上的关闭事件向池化模块发出信号,将连接放回连接池中以备将来重用。”
_source:https://www.progress.com/tutorials/jdbc/jdbc-jdbc-connection-pooling
您的应用程序从池中借用一个连接,使用该连接,然后通过关闭该连接将其返回到池中。长时间在空闲池中进行连接不被视为问题。