java - 将基本数据源与连接池数据源混合在一起 : when to call close()?

标签 java mysql jdbc connection-pooling derby

我正在向我们的 Java 应用程序添加连接池。

该应用程序可以与不同的 RDBMS 配合使用,既可以作为桌面应用程序,也可以作为 headless Web 服务。基本实现在桌面模式下运行良好(rdbms = derby)。当作为 Web 服务(rdbms = mysql)运行时,我们发现需要连接池才能获得良好的并发行为。

我最初的方法是在启动时使用依赖项注入(inject)来决定使用基本数据源还是连接池数据源。

这种情况下的问题是我不知道何时调用connection.close()。我的理解是,使用连接池时,应该在每次查询后 close() ,以便可以回收连接对象。但当前的非池化实现会尝试尽可能长时间地保留 Connection 对象。

这个问题有解决办法吗?有没有办法回收基本连接对象?如果我不使用线程池连接对象调用connection.close(),会发生什么情况?

或者混合这两种连接策略只是一个糟糕的设计?

最佳答案

如果我理解正确的话,本质上你是通过尽可能长时间地保持连接来实现自己的池实现。如果此策略成功(即程序的行为如您所描述的那样),那么您已经拥有自己的池了。添加池唯一能给你带来的好处是提高建立新连接时的响应时间(因为你不会真正建立一个连接,你将从池中获取它),这显然不会经常发生.

所以,我会回到这个问题背后的假设:您的并发性能问题实际上与数据库池有关吗?如果您在 MySQL 而不是 Derby 中使用事务,这可能是并发问题的一个重要原因,作为不同潜在原因的示例。

要直接回答您的问题,请始终使用数据库池。它们的开销非常小,当然可以更改代码以快速释放连接(即,当请求完成时,而不是只要用户打开屏幕),而不是永远保留它们。

关于java - 将基本数据源与连接池数据源混合在一起 : when to call close()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2321403/

相关文章:

java - Spring事务注解-获取 Activity 事务

java - 如何将结果写入JTextArea

mysql - EXPLAIN 显示 "DEPENDENT SUBQUERY"并且从 MariaDB 迁移到 MySQL 后非常慢

java - PSQL JDBC事务导致死锁

php - 来自 2 个相关表的时间表

php - 如果用户选择级联的某个选项,则删除带有文本输入的选择标签

java - iBatis java.lang.OutOfMemoryError : Java heap space 错误

Mac 上的 Java SplashScreen 始终位于最前面

java - 从静态方法更改非静态值

java - 在 'when' 子句 :Drools 中获取规则名称