开发者社区> 问答> 正文

多并发环境下多次获取和关闭Connection导致Connection数组内部连接重复

1.开启多个线程同时获取Connection和关闭Connection(10-30个线程)

2.重复多次后,有机率出现Connection数组内部连接重复情况

3.出现问题后DataSource的ActiveCount数也会有异常,连接都断开了,ActiveCount还会有值,重复跑下去ActiveCount都会超过MaxActive, 但createCount和poolingCount值就没有增加。

4.使用的durid版本是1.1.22版本

5.以下是dump下来的connections数组情况

原提问者GitHub用户chenyangcun

展开
收起
山海行 2023-07-05 18:13:11 135 0
4 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    看起来是在多线程环境下使用了共享的 Connection 数组,导致多个线程同时获取和关闭 Connection,从而导致 Connection 的重复使用和异常。

    2023-07-30 20:00:20
    赞同 展开评论 打赏
  • 使用Druid连接池时遇到了一些问题。多个线程同时获取和关闭连接时可能导致连接数组内部连接重复,并且在出现问题后,连接池的ActiveCount数异常,连接没有正确关闭,导致ActiveCount超过了MaxActive的限制。

    2023-07-11 09:17:00
    赞同 展开评论 打赏
  • 在minEvictableIdleTimeMillis小于keepAliveBetweenTimeMillis时,连接池中可能会保留多个相同的连接,导致获取连接时拿到同一个连接。 可以参考 https://github.com/alibaba/druid/issues/4316

    原回答者GitHub用户tain198127

    2023-07-06 10:51:44
    赞同 展开评论 打赏
  • 根据您提供的信息,出现连接重复的问题可能是由于并发环境下多个线程同时获取和关闭 Connection 导致的。这种情况下,可能会发生竞争条件,其中一个线程在另一个线程关闭连接之前重新获取了相同的连接。

    另外,您还提到在出现问题后 DataSource 的 ActiveCount 数也会异常。这可能是因为连接没有正确关闭,导致连接池中的连接计数器没有相应地减少。

    要解决这个问题,可以考虑以下几点:

    1. 确保在多线程环境下使用连接时进行适当的同步控制,以避免竞争条件。可以使用 synchronized 关键字或其他类似的机制来确保一次只有一个线程访问连接。

    2. 确保在每个线程使用完连接后都正确关闭连接,以释放资源并更新连接池的计数器。可以使用 try-with-resources 或手动关闭连接来确保连接被正确关闭。

    3. 检查您使用的 Druid 版本是否存在已知的连接重复问题。如果有,请尝试升级到最新版本的 Druid,看是否解决了该问题。

    4. 如果问题仍然存在,您可以尝试使用其他连接池实现来替代 Druid 进行测试,以确定是否与连接池本身有关。

    2023-07-05 18:54:26
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载