- 浏览: 59487 次
- 性别:
- 来自: 北京
最新评论
-
suifeng214:
想问一下 楼主高并发是怎样测试的
java连接池性能测试报告 -
HeartArea:
这个不错,先留着
Tomcat jdbc-pool 与 commons DBCP 的参数对比【翻译全部属性】 -
chaodongyue:
求测试代码
java连接池性能测试报告 -
duzc2:
chgyan 写道 guangyan ?
服务端Mina线程关系和数据流动分析 -
chgyan:
服务端Mina线程关系和数据流动分析
一 当前问题
目前应用的 Proxool 连接池,在高并发情况下会出现:
1. DataSource.getConnection() 方法会根据 ProxoolDataSource.simultaneousBuildThrottle 限制连接创建的并发,超出限制将抛出 “java.sql.SQLException: We are already in the process of making 11 connections and the number of simultaneous builds has been throttled to 10 ” 异常;
2. 当满足条件 “connectionCount >= getDefinition().getMaximumConnectionCount() && connectionPool.getAvailableConnectionCount() < 1” 时, DataSource.getConnection() 方法将抛出 “java.sql.SQLException: Couldn't get connection because we are at maximum connection count (200/200) and there are none available ” 异常;
3. 当满足条件 “ connectionCount >= getDefinition().getMaximumConnectionCount() ” 时 , DataSource.getConnection() 方法将抛出 “java.sql.SQLException: org.logicalcobwebs.proxool.ProxoolException: ConnectionCount is 200. Maximum connection count of 200 cannot be exceeded. ” 异常。
第一种异常可以修改配置文件,增加 simultaneousBuildThrottle 避免,但后两种情况只能增加数据库连接。并发量大于数据库连接数,必然会报后两种异常。可见 Proxool 并未具有完整的连接池实现,其尚未具有处理高并发应用的能力。
为减少以上情况的发生,必须设置 Proxool 数据库连接数大于等于业务线程数
当业务线程数为 300 时,数据库连接池的最大连接数必须大于三百。这里说 “ 大于 ” ,意义是即使业务线程数为 300 、数据库连接数为 300 ,也不能保证不报后两种异常。
维持过多的连接对于数据可游戏服务器都有一定的资源浪费,而且有碍新的服务器分布式、集群的实现。
经过网上搜索,找到其他连接池实现: DBCP 、 Tomcat JDBC Pool 、 DBPool 、 C3P0 、 BoneCP 、 Db Connection Broker 、 MiniConnectionPoolManager 。
DBCP 为 Tomcat6 默认连接池,但 1.2 版本倍受缓慢诟病,最新版本为 1.4 。 Tomcat JDBCPool 是 Tomcat 在 Tomcat7 中保留 DBCP 连接池以兼容使用 DBCP 连接池的已有应用,并提供新的 Tomcat JDBC Pool 作为 DBCP 的可选替代,修改一行配置文件即可启用 [1] 。 DBPool 为 ObjectWeb 开源产品,但多年未维护。 C3P0 为 Hibernate 默认连接池。 BoneCP 为新兴产品,网上评价极高。
Db Connection Broker 、 MiniConnectionPoolManager 是两个轻量级连接池,实现只有 1 个类。
其中 DBCP 、 C3P0 已被广泛应用,可以认为稳定可靠。
Db Connection Broker 、 MiniConnectionPoolManager 未提供 javax.sql.DataSource 接口实现,不予考虑。
经过对 API 和部分代码的研究,除 Proxool 以外所有连接池均有无可分配链接时让线程等待的功能,并提供超时参数或等价替代方案,超时未取得连接则抛出异常。
2 性能
为测试连接池性能,撰写测试程序,多线程无延迟持续查询“ select 1 ”,分别测试单位时间内查询次数。
1 在双核、 3G 内存,最大连接 5 ,发连接改为 4 , BoneCP 分 2 区,不计算预热阶段,持续时间 1 分钟:
Proxool 虽然在性能上远超 DBPool ,但第一次测试报 3 次异常,第三次测试报 2 次异常,均为第三种异常“ ProxoolException: ConnectionCount is 5. Maximum connection count of 5 cannot be exceeded. ”,线程数小于连接数竟然还报错,不可容忍; C3P0 明显领先; DBCP 紧随其后,可见两大著名连接池果然给力;新星 BoneCP 一度超越 DBCP ,平均成绩名列第三; TomcatPool 排在第四,但性能稳定。
2 在双核、 3G 内存,最大连接 5 ,并发线程 500 , BoneCP 分 2 区,持续三分钟,不计算预热阶段,测试三次,测试结果如下:
TomcatPool 在高并发低连接数情况下,性能稍强于 DBCP ,但不明显; BoneCP 被 Tomcat 和 DBCP 甩在后面; C3P0 表现一般; DBPool 稳稳淘汰。
3 在 4 核 cpu 、 1000 线程、 200 连接、 BoneCP 分 100 区,连续 15 分钟,不计算预热阶段,测试次数结果如下( DBPool 在多次测试结果中远远落后于其他,为节约时间这次未参与测试):
可见 DBCP 在高并发、高连接数情况下,查询量远远超过位于第三代 C3P0 并甩开后两名十万次左右; BoneCP 和 TomcatPool 性能接近; C3P0 远远落后前三者。
高并发时 visualvm 线程状态记录如下:
从线程状态记录中可见, DBCP 和 TomcatPool 可以快速的交付连接,在途中形成琐碎的绿色条带, DBCP 图中有 3 处可忽略的红色条带,而 TomcatPool 在线程启动时被锁一段时间。 C3P0 大量使用同步锁,产生了大量的红色条带。QueryThread线程为 BoneCP查询线程, 没有使用同步锁。 DBPool 基本上全部使用同步机制,导致大量线程等待。
由于没有对源代码深入分析,尚不知 BoneCP 为何落后 TomcatPool 和 DBCP 。
综上所述,新版 DBCP 连接池仍然是一款高性能的杰作。
三 后记
以上列出仅为典型测试数据,本次测试实际耗时将近一周,大量数据未能展示。
在一些记录中显示,项目工程中包含的 DBCP 1.2 的性能确实不如人意,仅仅超过 DBPool 这款同样古老的同胞,但新版 DBCP 1.4+commons pool 1.6 的绝佳配合将 DBCP 的性能推进到一个新的高峰。下图为 DBCP 1.2 的线程状态:
BoneCP 这一新兴在速度上给人相当大的惊喜,但其内存回收依赖于独立线程,默认情况下 BoneCP 会启动很多附加线程,其中大部分线程将保留到程序结束。利用其它线程回收未关闭的 connection 、 statement 、 result 带来的结果是,如果未关闭 statement 或 result ,而只关闭 connection ,那么 statement 和 result 将延迟回收,在如此高并发、高频率的测试中这样的延迟回收将导致一分钟之内将 2G 内存装满、程序崩溃。
下图为部分附加线程,实际情况要好长的列表,截图不下来了。。
下图为业务线程结束,并且已经对数据源 close 操作之后,仍然有部分线程持续运行。
下图右上角图像显示 proxool 的内存占用大于其他,而右下角图像显示 BoneCP 线程数远远大于其他。
评论
找个新的dbcp试试去,很感谢楼主给上了这么一课
客气了,分享才有进步。我也要跟很多人去学习。
哎呀,那个代码很简单,就写了一个工厂类,提供这几个数据源导出的 DataSource ,然后再协议个测试类,从工厂类里面取个数据源,然后开不同数量的线程,循环指定次数或者持续指定时间的查询 select 1。
由于sql简单,返回速度快,可以将线程间争抢资源的性能损耗凸显出来。
visualvm 就是jdk的bin目录下面那个。
哦哦,谢谢
visualvm 就是jdk的bin目录下面那个。
发表评论
-
在 Eclipse 里使用 Java 6 注解处理器
2012-06-29 23:49 3510在 Eclipse 里使用 Java 6 注解处理器 ... -
JDK 7 特性
2012-06-29 00:09 1317JDK 7 特性 虚拟机 JSR 292:支持动 ... -
Java SE 7 和 JDK 7 兼容性
2012-06-29 00:08 5883Java SE 7 和 JDK 7 兼容性 兼 ... -
java的Integer缓冲
2012-05-28 15:14 2456java.lang.Integer.valueOf ... -
DBCP和Tomcat jdbc-pool 对比
2012-05-23 17:29 3452一 性能 低并发情况下DBCP略强于jdbc-pool,高 ... -
Tomcat jdbc-pool 与 commons DBCP 的参数对比【翻译全部属性】
2012-05-22 17:33 3819通用属性 属性名 描述(DBCP/To ... -
不同并发量下Tomcat jdbc-pool和DBCP连接池的性能和包依赖
2012-05-22 11:47 3045最小连接5,最大连接50,无延迟,排除预热,循环查询“sele ... -
[翻译]DBCP释放历史
2012-05-22 00:28 1444版本日期 描述 ... -
[翻译]Why another connection pool project?为什么还需要另外的连接池项目?
2012-05-22 00:01 1721英文原文: http://www.tomcatexpert.c ... -
(翻译)Tomcat JDBC 连接池
2012-05-21 17:52 4286介绍 org.apache.tomcat.jdbc. ... -
JAVA NIO和MINA发送数据过程解析
2012-05-11 14:30 4283NIO发送数据过程: 1 将 ... -
开发环境Eclipse和GameServer的JVM调优
2012-05-11 10:03 1559杜天微 2012-3-29 系统信息: XP SP ... -
JVM编译期字符串连接优化分析
2012-05-11 09:57 2283为了研究javac对于String ... -
为了研究变量声明在for语句块前和for语句块内部的区别
2012-05-11 09:54 1195编译并反编译BeforeFor和InFor,对比如图《java ... -
服务端Mina线程关系和数据流动分析
2012-05-11 09:50 3576一 线程关系 NioSocketAcceptor类 线 ...
相关推荐
数据库连接池,是一种相当实用的应用程序。它可以保存、维护及创建用户所需的数据库连接。从而使得用户得到一个连接的时间降低90%以上。大大提升了数据库访问的反应时间。 这个是一个开源的代码。大家可以修改它、...
数据库连接池,是一种相当实用的应用程序。它可以保存、维护及创建用户所需的数据库连接。从而使得用户得到一个连接的时间降低90%以上。大大提升了数据库访问的反应时间。 这个是一个开源的代码。大家可以修改它、...
面向对象软件设计是当今软件设计模式的潮流,而基于面向对象软件设计...通过实验测试及连接时间的对比分析,看到了4种方法性能的差别,验证了文中提出的新型连接池的访问时间最优,可以极大地提高数据库的访问效率。
连接池的基本工作原理 1、基本概念及原理 由上面的分析可以看出,问题的根源就在于对数据库连接资源的低效治理。 我们知道,对于共享资源,有一个很闻名的设计模式:资源池(Resource Pool)。 该模式正是为了...
R2 jdbc连接池,用于java程序中jdbc连接池的配置管理,可应用于非web项目(纯java项目),全参数化配置。 应用时,先用rar打开jar包,拷贝r2.properties文件到class目录,并修改参数。 本包需要用到log4j,请在...
R2 jdbc连接池,用于java程序中jdbc连接池的配置管理,可应用于非web项目(纯java项目),全参数化配置。 应用时,先用rar打开jar包,拷贝r2.properties文件到class目录,并修改参数。 本包需要用到log4j,请在调用...
clearpool和其它流行的数据库连接池的性能比较请运行测试用例:https://github.com/xionghuiCoder/clearpool/blob/master/src/test/java/org/opensource/clearpool/CompareWithPopularPool.java。 标签...
v1.2处理了oracle环境下由于服务器关闭休眠链接造成的连接池循环检测进程异常退出的情况,改为当循环周期大于服务器关闭休眠链接间隔时,后台打印异常并重新连接数据库。 R2 jdbc连接池,用于java程序中jdbc连接池...
BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。
对于共享资源,有一个很著名的设计模式:资源池(Resource Pool)。该模式正是为了解决资源的...更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量﹑使用情况,为系统开发﹑测试及性能调整提供依据。
R2 jdbc连接池,用于java程序中jdbc连接池的配置管理,可应用于非web项目(纯java项目),全参数化配置。 应用时,先用rar打开jar包,拷贝r2.properties文件到class目录,并修改参数。 本包需要用到log4j,请在...
proxool数据库连接池实例源码,性能很不错的一个连接池,带监控功能可以方便检测数据库没有关闭的连接
R2 jdbc连接池,用于java程序中jdbc连接池的配置管理,可应用于非web项目(纯java项目),全参数化配置。 应用时,先用rar打开jar包,拷贝r2.properties文件到class目录,并修改参数。 本包需要用到log4j,请...
R2 jdbc连接池,用于java程序中jdbc连接池的配置管理,可应用于非web项目(纯java项目),全参数化配置。 应用时,先用rar打开jar包,拷贝r2.properties文件到class目录,并修改参数。 本包需要用到log4j,请在调用...
R2 jdbc连接池,用于java程序中jdbc连接池的配置管理,可应用于非web项目(纯java项目),全参数化配置。 应用时,先用rar打开jar包,拷贝r2.properties文件到class目录,并修改参数。 本包需要用到log4j,请在调用...
R2 jdbc连接池,用于java程序中jdbc连接池的配置管理,可应用于非web项目(纯java项目),全参数化配置。 应用时,先用rar打开jar包,拷贝r2.properties文件到class目录,并修改参数。 本包需要用到log4j,请在调用...
阿里巴巴推出的国产数据库连接池,据网上测试对比,比目前的DBCP或C3P0数据库连接池性能更好。
它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步...
它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步...
它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步...