死锁
压测sharding-jdbc 改造一个原先用类似mycat的一个程序放到压测平台后,发现运行一会程序就假死了。于是在本地压测。同样运行一会就假死,然后debug。 发现在获取分布式id的时候在锁的地方进行不下去。然后怀疑是哪里导致了死锁,于是运行jstack -l 如下
发现很多请求的线程都等待在了druid的takelast 方法。进去这个方法看,发现是 一个生产者消费者模式的 获取连接的数组。由于没有可以用的链接了(大于最大的链接数 默认是8个)。所以没有链接了就在这里一直阻塞。为什么没有链接了。及时是很多的请求,那么获取到链接请求的线程也应该往下走,而不是假死。于是继续往下看线程状态。发现开始的几个请求阻塞在了分布式id获取id的地方
进去nextRang查看 发现他会从新获取连接 而不是用当前线程的链接
mybatis-spring包提供的sqlsessionFactory 可以保证当前线程都是同一个session (同一个链接)但是这里 获取分布式id的时候是重新获取连接。没有用sqlsessionFactory 来管理。sqlsessionFactory 具体怎么分析https://blog.csdn.net/z530065424/article/details/82864328
由于我在设置druid数据源的时候没有传入最大的链接数,和最大等待时间。 因此默认链接最多只有8个。且获取连接时 没有等待期限。在这两个前提下。多个请求进来 将连接数用满。一