首页 » java » 正文

Java连接池的那些事儿

Apache dbcp

1. Apache Tomcat推荐使用DBCP。
2. 效率高,但是数据库重启或者强制断开连接,不会重现连接数据库,需要重启应用。
3. 由于不稳定,用的较少。

c3p0,proxool

1. Hibertnate推荐使用这两个数据源。
2. 效率低,但是很稳定,数据库重启后可以重新连接。
3. 由于稳定用的较多。

boneCP数据源 – http://www.jolbox.com/

1. 新型的数据源,效率高于dbcp和c3p0 25倍。
2. 使用了新型的锁concurrent。
3. 使用了分区减小了竞争。

maxActive的设置:

默认是8个,假设数据库操作没有延迟,这个数量应该和cpu核数保持一致,因为最多同时cpu核数的线程可以同时运行,但是数据库操作都是有响应时间的,因此,需要适当的提高这个连接数量,一般在几十到几百,也取决于服务器端的数据库性能,以及有多少个应用节点连接这个数据库,但是实际的最佳取值是需要压测来决定的。

注意:连接池的设置主要取决于CPU和IO等待,连接池访问数据库都是小数据,网络IO没压力,很少能打满。

maxIdle的设置:

最好保持和maxActive一致,免得创建和销毁连接需要损失的性能。

设置连接的用例

首先考虑一个服务节点处理读10000 QPS,假设80%的数据都可以命中缓存,那么有20%的QPS要查库,也就是2000的QPS,考虑到后端数据库分成8实例8库8表,这样每个库的数据源承受250QPS的数据量,假设数据库平均处理时间是100ms,一秒串行处理10个数据库访问,也就是并行处理250/10 = 25个请求,那么数据源应该设置25个连接,当然这也是理论值,还取决于CPU的数量和速度,根据实测进行微调。

参考:

http://blog.csdn.net/fairyhawk/article/details/7565391

http://www.cnblogs.com/linjiqin/p/3443643.html

http://www.jolbox.com/

http://zc0604.iteye.com/blog/1160502

http://www.cnblogs.com/zhwl/archive/2013/07/23/3208550.html