`
duzc2
  • 浏览: 60773 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

java连接池性能测试报告

 
阅读更多

  当前问题

1  高并发异常

         目前应用的 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 并未具有完整的连接池实现,其尚未具有处理高并发应用的能力。

 

2  多连接数

         为减少以上情况的发生,必须设置 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 个类。

1  API

         其中 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 线程数远远大于其他。


 



[1]      http://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html

  • 大小: 31.5 KB
  • 大小: 24.1 KB
  • 大小: 7.5 KB
  • 大小: 51.1 KB
  • 大小: 49.3 KB
  • 大小: 48.9 KB
  • 大小: 27.5 KB
  • 大小: 38.5 KB
  • 大小: 33.2 KB
  • 大小: 15.3 KB
  • 大小: 15.1 KB
  • 大小: 28.5 KB
2
0
分享到:
评论
10 楼 suifeng214 2014-03-28  
想问一下 楼主高并发是怎样测试的
9 楼 chaodongyue 2012-10-14  
求测试代码
8 楼 Litsky 2012-09-08  
  人才哥啊 ………… ,刚把c3p0换成 BoneCP ……  噩耗啊,一直不知道“BoneCP 大部分线程将保留到程序结束”
找个新的dbcp试试去,很感谢楼主给上了这么一课
7 楼 duzc2 2012-09-07  
tiwenzhuanyong 写道
感谢楼主的辛苦测试,受益了

客气了,分享才有进步。我也要跟很多人去学习。
6 楼 tiwenzhuanyong 2012-09-05  
感谢楼主的辛苦测试,受益了
5 楼 duzc2 2012-06-29  
Black_Sun 写道
楼主可以把测试的代码放出来吗?学习一下!

哎呀,那个代码很简单,就写了一个工厂类,提供这几个数据源导出的 DataSource ,然后再协议个测试类,从工厂类里面取个数据源,然后开不同数量的线程,循环指定次数或者持续指定时间的查询 select 1。
由于sql简单,返回速度快,可以将线程间争抢资源的性能损耗凸显出来。
4 楼 Black_Sun 2012-06-27  
楼主可以把测试的代码放出来吗?学习一下!
3 楼 刘家四弟 2012-05-21  
duzc2 写道
刘家四弟 写道
你好,请问visualvm 线程状态记录是用什么工具

visualvm 就是jdk的bin目录下面那个。

哦哦,谢谢
2 楼 duzc2 2012-05-21  
刘家四弟 写道
你好,请问visualvm 线程状态记录是用什么工具

visualvm 就是jdk的bin目录下面那个。
1 楼 刘家四弟 2012-05-21  
你好,请问visualvm 线程状态记录是用什么工具

相关推荐

    Java连接池评估报告

    ### Java连接池评估报告知识点详解 #### 一、引言 本文档主要针对Java环境下的数据库连接池进行了全面评估,旨在帮助开发者理解不同连接池之间的差异,并为选择合适的连接池提供依据。报告不仅包含了对现有连接池...

    Java 连接池实现

    总的来说,Java连接池是提高数据库应用性能的重要工具,通过合理配置和选择合适的连接池实现,我们可以有效地管理和利用数据库连接,减少系统资源的消耗,提升整体系统的响应速度和稳定性。对于开发者来说,理解和...

    java socket连接池 实现

    Java Socket 连接池实现是提高网络应用性能和效率的关键技术之一。在高并发的网络环境中,频繁地创建和销毁Socket连接...在选择和使用Socket连接池时,应根据项目需求和性能测试结果来调整参数,以达到最佳的性能效果。

    java ftp连接池

    Java FTP连接池是一种用于管理FTP(文件传输协议)连接的资源池,它的主要目标是提高应用程序的性能和效率。在传统的FTP操作中,每次需要连接到FTP服务器时都会创建一个新的连接,这会消耗大量时间和系统资源。而...

    浅谈java连接池

    常见的Java连接池实现有Apache的DBCP、C3P0、HikariCP以及Tomcat的内置连接池等。选择合适的连接池依赖于应用程序的需求,如并发量、性能要求、稳定性等因素。正确的配置和使用连接池是提升Java应用程序性能、降低...

    java socket连接池

    Java Socket连接池是一种优化网络通信性能的技术,它允许应用程序复用已经建立的Socket连接,从而减少因频繁创建和销毁Socket连接而产生的开销。在高并发的服务器环境中,Socket连接池能够有效地提升系统效率和响应...

    模拟的Java连接池

    Java连接池是应用程序管理数据库连接的一种机制,它通过复用已存在的数据库连接,避免了频繁创建和销毁连接带来的性能开销。在Java中,连接池是实现高效数据库操作的重要手段,尤其是在高并发环境下。本篇文章将深入...

    Java jdbc数据库连接池总结

    更为重要的是我们可以通过连接池的管理机制监视数据库的连接数量、使用情况,为系统开发、测试及性能调整提供依据。 连接池的基本工作原理是:当应用程序需要建立数据库连接时,连接池管理器会检查当前是否有可用的...

    Java连接池的实现

    Java连接池是优化数据库操作的关键技术之一,它允许应用程序高效地管理和重用数据库连接,避免了频繁创建和关闭连接导致的性能开销。本篇将详细介绍如何在Java中实现一个简单的连接池,以及相关的概念和技术。 首先...

    java实现连接池

    理解并正确使用Java连接池是任何涉及数据库操作的Java应用的基础,它对于优化系统性能、提高资源利用率和保证服务稳定性都有着重要作用。选择合适的连接池库并进行适当的配置,可以进一步提升系统的响应速度和并发...

    java高性能数据库连接池V5.0

    数据库连接池,是一种相当实用的应用程序。它可以保存、维护及创建用户所需的数据库连接。从而使得用户得到一个连接的时间降低90%以上。大大提升了数据库访问的反应时间。 这个是一个开源的代码。大家可以修改它、...

    java连接池jtds连接数据库

    Java连接池,也称为JDBC连接池,是Java应用程序中管理数据库连接的一种高效方式。它通过预先创建并维护一定数量的数据库连接,避免了每次应用需要连接数据库时的开销,提高了系统的性能和响应速度。在Java中,有许多...

    mysql连接池java源码

    一个简单的Java连接池实现通常包括以下几个核心组件: - **ConnectionFactory**:创建数据库连接的工厂类,负责初始化连接。 - **PoolManager**:连接池管理器,维护连接池的生命周期,包括初始化、分配、回收和...

    mysql,sqlserver,oracle,java连接池,连接程序

    本项目涵盖了对MySQL、SQL Server、Oracle这三种主流关系型数据库的Java连接池实现,旨在提供一个可以直接在Eclipse环境中运行的代码示例。 首先,我们来了解一下什么是连接池。数据库连接池是一种在应用程序启动时...

Global site tag (gtag.js) - Google Analytics