我试图更好地理解如果多个线程尝试使用相同的 JDBC 连接同时执行不同的 sql 查询会发生什么。
我看到 Apache DBCP 使用同步协议来确保从池中获取的连接将从池中删除,并使其不可用,直到它们被关闭。这似乎比实际需要的更不方便。我正在考虑简单地通过创建打开连接的静态列表并以循环方式分发它们来构建我自己的“池”。
我不介意偶尔的性能下降,而且每次使用后不必关闭连接的便利性似乎非常吸引人。我这样做有什么坏处吗?
我使用 AWS RDS Postgres 数据库和 Java 11 运行了以下一组测试:
-
创建一个包含 11M 行的表,每行包含一个 TEXT 列,并填充随机的 100 个字符的字符串
-
随机选择一个 5 个字符的字符串,并在上表中搜索该字符串的部分匹配项
-
计算上述查询返回结果所需的时间。就我而言,大约需要 23 秒。由于返回的结果很少,我们可以得出结论,这 23 秒的大部分时间都花在等待数据库运行全表扫描,而不是发送请求/响应数据包
-
并行运行多个查询(使用不同的关键字),使用不同的连接。就我而言,我发现它们都在大约 23 秒内完成。即,查询正在高效并行化
-
使用以下命令在并行线程上运行多个查询相同的连接。我现在看到第一个结果在大约 23 秒内返回。第二个结果将在大约 46 秒内返回。第三次约 1 分钟。等等。所有结果在功能上都是正确的,因为它们与该线程查询的特定关键字匹配
作为 Joni 之前提到的补充,他的结论也与我在 Postgres 上看到的行为相符。看起来所有“正确性”都被保留,但所有并行性的好处都丢失了,如果同时在同一连接上发送多个查询。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)