【发布时间】:2014-11-09 22:26:46
【问题描述】:
在java中与数据库通信,我们经常按照以下步骤进行:
- 加载驱动程序
- 建立连接
- 创建一个声明或
PreparedStatement - 获取
ResultSet - 关闭连接
我很困惑我们应该关闭连接,都说创建连接很昂贵,所以我们为什么不能这样做:
static
{
try
{
connection = DriverManager.getConnection(connectorURL,
user, password);
} catch (SQLException e)
{
e.printStackTrace();
}
}
我们只是将连接创建为单例,并在任何地方使用它。不能吗?如果我这样使用,会发生什么?
如果我不关闭连接,会发生什么?
另外,我们将使用连接池,它会在池中创建一些连接,我们从池中获取连接,池中的连接也不会关闭,为什么如果我们不使用池,如果我们不使用,我们需要按照步骤关闭连接吗?
很迷茫,不知道原理是什么。请帮我。谢谢。
【问题讨论】:
-
即使在使用连接池时,您也必须关闭连接:这向连接池发出信号,表示它可以重用。您存储在静态变量中的解决方案非常糟糕:它可能会导致各种难以调试的并发问题。如果您担心创建连接的成本,那么您应该使用连接池,而不是通过
DriverManager创建连接。 -
你可以做你写的,但连接不是线程安全的,所以它没有意义,除非你也打算引入同步,作为一种治疗方法比疾病更糟糕。最好使用线程池给您一个
Connection作为局部变量,并在方法退出时将其关闭以将其返回到池中。如果您不关闭它,它会泄漏并占用服务器资源。 -
@EJP 连接本身可能是线程安全的(JDBC 要求),但使用该连接的应用程序可能不是线程安全的。想想不同的事务隔离、边界(提交/回滚/自动提交)等。
标签: jdbc connection database-connection connection-pooling