- 浏览: 60898 次
- 性别:
- 来自: 北京
最新评论
-
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 3577在 Eclipse 里使用 Java 6 注解处理器 ... -
JDK 7 特性
2012-06-29 00:09 1447JDK 7 特性 虚拟机 JSR 292:支持动 ... -
Java SE 7 和 JDK 7 兼容性
2012-06-29 00:08 5996Java SE 7 和 JDK 7 兼容性 兼 ... -
java的Integer缓冲
2012-05-28 15:14 2545java.lang.Integer.valueOf ... -
DBCP和Tomcat jdbc-pool 对比
2012-05-23 17:29 3505一 性能 低并发情况下DBCP略强于jdbc-pool,高 ... -
Tomcat jdbc-pool 与 commons DBCP 的参数对比【翻译全部属性】
2012-05-22 17:33 3904通用属性 属性名 描述(DBCP/To ... -
不同并发量下Tomcat jdbc-pool和DBCP连接池的性能和包依赖
2012-05-22 11:47 3082最小连接5,最大连接50,无延迟,排除预热,循环查询“sele ... -
[翻译]DBCP释放历史
2012-05-22 00:28 1495版本日期 描述 ... -
[翻译]Why another connection pool project?为什么还需要另外的连接池项目?
2012-05-22 00:01 1764英文原文: http://www.tomcatexpert.c ... -
(翻译)Tomcat JDBC 连接池
2012-05-21 17:52 4379介绍 org.apache.tomcat.jdbc. ... -
JAVA NIO和MINA发送数据过程解析
2012-05-11 14:30 4413NIO发送数据过程: 1 将 ... -
开发环境Eclipse和GameServer的JVM调优
2012-05-11 10:03 1602杜天微 2012-3-29 系统信息: XP SP ... -
JVM编译期字符串连接优化分析
2012-05-11 09:57 2334为了研究javac对于String ... -
为了研究变量声明在for语句块前和for语句块内部的区别
2012-05-11 09:54 1233编译并反编译BeforeFor和InFor,对比如图《java ... -
服务端Mina线程关系和数据流动分析
2012-05-11 09:50 3665一 线程关系 NioSocketAcceptor类 线 ...
相关推荐
### Java连接池评估报告知识点详解 #### 一、引言 本文档主要针对Java环境下的数据库连接池进行了全面评估,旨在帮助开发者理解不同连接池之间的差异,并为选择合适的连接池提供依据。报告不仅包含了对现有连接池...
### Java连接池实例知识点解析 #### 一、Java连接池概念 在Java应用程序中,数据库连接是宝贵的资源。每一个数据库连接都需要消耗系统资源,并且频繁地创建和销毁连接会导致性能下降。因此,为了提高应用程序的效率...
总的来说,Java连接池是提高数据库应用性能的重要工具,通过合理配置和选择合适的连接池实现,我们可以有效地管理和利用数据库连接,减少系统资源的消耗,提升整体系统的响应速度和稳定性。对于开发者来说,理解和...
Java Socket 连接池实现是提高网络应用性能和效率的关键技术之一。在高并发的网络环境中,频繁地创建和销毁Socket连接...在选择和使用Socket连接池时,应根据项目需求和性能测试结果来调整参数,以达到最佳的性能效果。
Java FTP连接池是一种用于管理FTP(文件传输协议)连接的资源池,它的主要目标是提高应用程序的性能和效率。在传统的FTP操作中,每次需要连接到FTP服务器时都会创建一个新的连接,这会消耗大量时间和系统资源。而...
常见的Java连接池实现有Apache的DBCP、C3P0、HikariCP以及Tomcat的内置连接池等。选择合适的连接池依赖于应用程序的需求,如并发量、性能要求、稳定性等因素。正确的配置和使用连接池是提升Java应用程序性能、降低...
Java Socket连接池是一种优化网络通信性能的技术,它允许应用程序复用已经建立的Socket连接,从而减少因频繁创建和销毁Socket连接而产生的开销。在高并发的服务器环境中,Socket连接池能够有效地提升系统效率和响应...
Java连接池是应用程序管理数据库连接的一种机制,它通过复用已存在的数据库连接,避免了频繁创建和销毁连接带来的性能开销。在Java中,连接池是实现高效数据库操作的重要手段,尤其是在高并发环境下。本篇文章将深入...
更为重要的是我们可以通过连接池的管理机制监视数据库的连接数量、使用情况,为系统开发、测试及性能调整提供依据。 连接池的基本工作原理是:当应用程序需要建立数据库连接时,连接池管理器会检查当前是否有可用的...
Java连接池是优化数据库操作的关键技术之一,它允许应用程序高效地管理和重用数据库连接,避免了频繁创建和关闭连接导致的性能开销。本篇将详细介绍如何在Java中实现一个简单的连接池,以及相关的概念和技术。 首先...
理解并正确使用Java连接池是任何涉及数据库操作的Java应用的基础,它对于优化系统性能、提高资源利用率和保证服务稳定性都有着重要作用。选择合适的连接池库并进行适当的配置,可以进一步提升系统的响应速度和并发...
数据库连接池,是一种相当实用的应用程序。它可以保存、维护及创建用户所需的数据库连接。从而使得用户得到一个连接的时间降低90%以上。大大提升了数据库访问的反应时间。 这个是一个开源的代码。大家可以修改它、...
### Java数据库连接池知识点解析 #### 一、概念与作用 **Java数据库连接池**是一种在应用程序中管理和重用预创建的数据库连接的技术。通过连接池管理器预先创建一定数量的连接并将其存储在一个池中,当应用程序...
Java连接池,也称为JDBC连接池,是Java应用程序中管理数据库连接的一种高效方式。它通过预先创建并维护一定数量的数据库连接,避免了每次应用需要连接数据库时的开销,提高了系统的性能和响应速度。在Java中,有许多...
一个简单的Java连接池实现通常包括以下几个核心组件: - **ConnectionFactory**:创建数据库连接的工厂类,负责初始化连接。 - **PoolManager**:连接池管理器,维护连接池的生命周期,包括初始化、分配、回收和...
本项目涵盖了对MySQL、SQL Server、Oracle这三种主流关系型数据库的Java连接池实现,旨在提供一个可以直接在Eclipse环境中运行的代码示例。 首先,我们来了解一下什么是连接池。数据库连接池是一种在应用程序启动时...