【发布时间】:2015-12-31 20:31:12
【问题描述】:
我试图更好地理解如果多个线程尝试同时使用相同的 JDBC 连接执行不同的 sql 查询会发生什么。
结果在功能上是否正确?
性能影响是什么?
线程
A是否必须等待线程B完全完成其查询?或者线程
A是否能够在线程B发送查询后立即发送查询,之后数据库将并行执行这两个查询?
我看到 Apache DBCP 使用同步协议来确保从池中获得的连接从池中删除,并使其不可用,直到它们被关闭。这似乎比它需要的更不方便。我正在考虑通过创建打开连接的静态列表并以循环方式分发它们来构建我自己的“池”。
我不介意偶尔的性能下降,每次使用后不必关闭连接的便利似乎非常吸引人。我这样做有什么缺点吗?
【问题讨论】:
-
连接池不仅仅是一组连接。您应该真正了解连接池提供了什么这里的参数可以提供一些提示commons.apache.org/proper/commons-dbcp/configuration.html
-
我浏览了界面上的配置和其他 API,但没有一个对我的用例感兴趣。因此,为什么我最终编写了自己的实现,它大约有 10 行代码,完全符合我的需要,最大限度地减少同步开销,并且省去了在百万个地方添加 connection.close() 的麻烦。
-
在单个连接上多路复用多个线程是一个非常糟糕的主意。只需使用连接池,检查连接并在完成后将其返回池(关闭它)。例如,您是否考虑过如果一个线程想要提交而另一个线程想要回滚会发生什么?您要么丢失数据,要么提交了错误的数据。那是一个真正糟糕的地方。另外,但不使用
Connection.close(),你会让别人很不清楚你在做什么。 -
尝试使用 PostgreSQL 42.2.5 JDBC 驱动程序执行此操作,但两个线程都被阻塞了。
标签: java jdbc database-connection connection-pooling apache-commons-dbcp