锁的公平和效率是一个需要平衡的问题。
如果配置了maxWait,在连接不够用争用时,unfair模式的ReentrantLock.tryLock方法存在严重不公的现象,个别线程会等到超时了还获取不到连接。
版本 | 处理方式 | 效果 |
---|---|---|
0.2.3之前 | unfair | 并发性能很好。maxWait>0的配置下,出现严重不公平现象 |
0.2.3 ~ 0.2.6 | fair | 公平,但是并发性能很差 |
0.2.7 | 通过构造函数传入参数指定fair或者unfair,缺省fair | 按需要配置,但是比较麻烦 |
0.2.8 | 缺省unfair,通过构造函数传入参数指定fair或者unfair;如果DruidDataSource还没有初始化,修改maxWait大于0,自动转换为fair模式 | 智能配置,能够兼顾性能和公平性 |
可以手工配置
dataSouce.setUseUnfairLock(true)