java.sql.Connection closing/caching最佳实践

java.sql.Connection closing/caching最佳实践,java,sql,database-connection,Java,Sql,Database Connection,关闭或缓存sql连接的最佳做法是什么? 我看到有人说总是在最后一个街区关闭它。 虽然我也看到一些关于缓存它们以备将来使用的事情 为每个任务打开新连接的成本有多高 我刚开始开发一个别人编写的java数据仓库应用程序。(我没有数据库经验)它是一个单线程应用程序,将文件加载到数据库中,并进行一些聚合和分析。我们遇到了一些死锁问题,我认为这在单线程应用程序中不应该是一个问题。我看到处理DB连接的类中所有的异常都被吞没了,并且没有被记录,所以我希望在这些异常中添加日志可以提供一些见解 但我希望在此期间能得

关闭或缓存sql连接的最佳做法是什么?
我看到有人说总是在最后一个街区关闭它。 虽然我也看到一些关于缓存它们以备将来使用的事情

为每个任务打开新连接的成本有多高

我刚开始开发一个别人编写的java数据仓库应用程序。(我没有数据库经验)它是一个单线程应用程序,将文件加载到数据库中,并进行一些聚合和分析。我们遇到了一些死锁问题,我认为这在单线程应用程序中不应该是一个问题。我看到处理DB连接的类中所有的异常都被吞没了,并且没有被记录,所以我希望在这些异常中添加日志可以提供一些见解


但我希望在此期间能得到一些关于处理DB连接的最佳实践的指导

无论您是否使用连接池,任何数据库代码都应遵循以下形式:

try (
  Connection connection = dataSource.getConnection();
  PreparedStatement preparedStatement = ...
)
{
  ...
}
dataSource
可以是一个池或一个简单的连接工厂,对于您的代码来说,这并不重要,它只是从哪里获得
connection
s

这就是说,我将使用Spring的类,它与上面的代码基本相同

关于“为每个任务打开新连接的成本有多高?”这个问题,答案是非常重要的,至少与从池中获取一个连接相比。您还必须考虑如果运行大量任务会发生什么——大多数数据库将被配置为限制连接的数量。

底线是,除了最简单的应用程序之外,您应该使用类似的连接池,并根据需要调整其大小


关于你的僵局,这很可能发生在数据库中,根据数据库配置的不同,在更新数据时可以进行各种锁定。

这可能是
程序员的一个问题
@
stackexchange
当前此代码的可能副本有一个ConnectionPool类,该类仅保存一个列表连接的数量。每个连接都有一个“isUsed”标志,在发送时设置为true。然后,在执行sql的方法结束时,它基本上会告诉池“我完成了”,池会提交连接中的任何内容,并将“isUsed”设置回false,以便知道它可以再次分发连接。--从你所说的,我在网上读到的,看起来这是错误的。池的关键在于准备好新的连接,而不是反复重复使用同一个连接。是这样吗?一个“正确”的连接池将使用调用
连接。关闭
连接返回到池中(而不是实际关闭它)。这样,调用代码就可以知道是否正在使用池。。。很抱歉有新的问题。。。但听起来好像你在说,在关闭连接后,它已经准备好返回池。。。我在想,一旦它关闭,它就消失了。。。需要创建一个新连接。。。但是你是说一个连接在关闭后可以被重用/重新打开吗?它通常是这样做的,池为你提供了
连接
的实现,它是实际
连接
的包装器。池中实现
连接
的所有方法都委托给实际的
连接
,除了
关闭
,它将连接放回池中。啊-我明白了。。。那么,有没有一个基本的最佳实践来实现上述密切关系呢?它应该总是调用commit吗?是否有某种检查可以或应该进行,以确保锁被释放等,并且连接是新的,为下一个调用方做好准备?