gpt4 book ai didi

java - 多个线程同时使用同一个 JDBC 连接

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:24:53 26 4
gpt4 key购买 nike

我试图更好地理解如果多个线程尝试使用相同的 JDBC 连接同时执行不同的 sql 查询会发生什么。

  • 结果在功能上是否正确?

  • 性能影响是什么?

  • 线程 A 是否必须等待线程 B 完全完成其查询?

  • 或者线程 A 是否能够在线程 B 发送查询后立即发送查询,之后数据库将并行执行两个查询?


我看到 Apache DBCP 使用同步协议(protocol)来确保从池中获得的连接从池中删除,并使其不可用,直到它们关闭。这似乎比它需要的更不方便。我正在考虑通过创建打开连接的静态列表并以循环方式分发它们来构建我自己的“池”。

我不介意偶尔的性能下降,每次使用后不必关闭连接的便利性似乎非常吸引人。我这样做有什么缺点吗?

最佳答案

我使用 AWS RDS Postgres 数据库和 Java 11 运行了以下一组测试:

  1. 创建一个包含 1100 万行的表,每行包含一个 TEXT 列,并填充一个随机的 100 个字符的字符串

  2. 随机选取一个5个字符的字符串,在上表中搜索该字符串的部分匹配

  3. Time 上述查询返回结果所需的时间。就我而言,大约需要 23 秒。因为返回的结果很少,我们可以得出结论,这 23 秒的大部分时间都花在了等待 DB 运行全表扫描上,而不是发送请求/响应数据包上

  4. 使用不同的连接并行运行多个查询(使用不同的关键字)。就我而言,我看到它们都在大约 23 秒内完成。即,查询被高效地并行化

  5. 使用相同的连接在并行线程上运行多个查询。我现在看到第一个结果在大约 23 秒后返回。第二个结果在大约 46 秒后返回。第三个在大约 1 分钟内。等等等等。所有结果在功能上都是正确的,因为它们与该线程查询的特定关键字匹配

为了补充 Joni 之前提到的内容,他的结论也符合我在 Postgres 上看到的行为。如果同时在同一连接上发送多个查询,似乎保留了所有“正确性”,但失去了所有并行优势

关于java - 多个线程同时使用同一个 JDBC 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32927346/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com