`

<转>几种常见数据库连接池的使用比较

 
阅读更多

 

几种常见数据库连接池的使用比较

最原始的数据库使用就是打开一个连接并进行使用,使用过后一定要关闭连接释放资源。由于频繁的打开和关闭连接对jvm包括数据库
都有一定的资源负荷,尤其应用压力较大时资源占用比较多容易产生性能问题。由此使用连接池的作用就显现出来,他的原理其实不复杂:
先打开一定数量的数据库连接,当使用的时候分配给调用者,调用完毕后返回给连接池,注意返回给连接池后这些连接并不会关闭,而是
准备给下一个调用者进行分配。由此可以看出连接池节省了大量的数据库连接打开和关闭的动作,对系统性能提升的益处不言而喻。
几个概念:
最小连接--应用启动后随即打开的连接数以及后续最小维持的连接数。
最大连接数--应用能够使用的最多的连接数
连接增长数--应用每次新打开的连接个数
举个例子说明连接池的运作:
假设设置了最小和最大的连接为10,20,那么应用一旦启动则首先打开10个数据库连接,但注意此时数据库连接池的正在使用数字为0--因为你并没有使用这些连接,而空闲的数量则是10。然后你开始登录,假设登录代码使用了一个连接进行查询,那么此时数据库连接池的正在使用数字为1、空闲数为9,这并不需要从数据库打开连接--因为连接池已经准备好了10个给你留着呢。登录结束了,当前连接池的连接数量是多少?当然是0,因为那个连接随着事务的结束已经返还给连接池了。然后同时有11个人在同一秒进行登录,会发生什么:连接池从数据库新申请(打开)了一个连接,连同另外的10个一并送出,这个瞬间连接池的使用数是11个,不过没关系正常情况下过一会儿又会变成0。如果同时有21个人登录呢?那第21个人就只能等前面的某个人登录完毕后释放连接给他。这时连接池开启了20个数据库连接--虽然很可能正在使用数量的已经降为0,那么20个连接会一直保持吗?当然不,连接池会在一定时间内关闭一定量的连接还给数据库,在这个例子里数字是20-10=10,因为只需要保持最小连接数就好了,而这个时间周期也是连接池里配置的。

好了,基本概念说完了,言归正传进行比较了。
首先说明的一点,为了应用便于移植以及可配置的角度,建议还是使用jndi统一进行连接池的配置。怎么配置其实网上都有很多例子,
这里简单举个例子(使用spring框架):
首先在应用的上下文定义中配置jndi名称,如一个resource.xml文件,里边的写法
    <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName"><value>jdbc/myapp</value></property>
    </bean>
注意dataSource这个bean在dao层(hibernate或jdbc)的配置文件里需要作为dataSource名称的属性配置到所有bean中
其中“jdbc/myds”这个就是jndi名称了,下一步就是在应用服务器连接池里进行数据库连接以及对应的jndi配置了

一 开源数据连接池
1 dbcp
dbcp可能是使用最多的开源连接池,原因大概是因为配置方便,而且很多开源和tomcat应用例子都是使用的这个连接池吧。
这个连接池可以设置最大和最小连接,连接等待时间等,基本功能都有。这个连接池的配置参见附件压缩包中的:dbcp.xml
使用评价:在具体项目应用中,发现此连接池的持续运行的稳定性还是可以,不过速度稍慢,在大并发量的压力下稳定性
有所下降,此外不提供连接池监控

2 c3p0
c3p0是另外一个开源的连接池,在业界也是比较有名的,这个连接池可以设置最大和最小连接,连接等待时间等,基本功能都有。
这个连接池的配置参见附件压缩包中的:c3p0.xml。
使用评价:在具体项目应用中,发现此连接池的持续运行的稳定性相当不错,在大并发量的压力下稳定性也有一定保证,
          此外不提供连接池监控。
          
3 proxool
proxool这个连接池可能用到的人比较少,但也有一定知名度,这个连接池可以设置最大和最小连接,连接等待时间等,基本功能都有。
这个连接池的配置参见附件压缩包中的:proxool.xml。
使用评价:在具体项目应用中,发现此连接池的持续运行的稳定性有一定问题,有一个需要长时间跑批的任务场景任务,同样的代码
在另外2个开源连接池中成功结束,但在proxool中出现异常退出。
但是proxool有一个优势--连接池监控,这是个很诱人的东西,大概的配置方式就是在web.xml中添加如下定义:
    <servlet>
        <servlet-name>admin</servlet-name>
        <servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class>      
   </servlet>
   <servlet-mapping>
      <servlet-name>admin</servlet-name>
      <url-pattern>/admin</url-pattern>
   </servlet-mapping>   
并在应用启动后访问:http://localhost:8080/myapp/admin这个url即可监控 
不过proxool本身的包在监测使用中会有编码问题,附件中有一个
解决此问题的包,参见附件压缩包中的:proxool-0.9.0RC3.jar。另外需要jdk1.5以上的环境。

总结时刻:
综上所述,这几种开源连接池各有优劣,推荐使用c3p0,经检验这种连接池性能稳定,承压能力强。而proxool尽管有明显的性能问题,
但由于它具备监控功能,因此建议在开发测试时使用,有助于确定是否有连接没有被关掉,可以排除一些代码的性能问题。

二 商业中间件连接池
上面列举了几种开源的连接池,其实可以肯定的说,如果条件允许使用weblogic和websphere等中间件,那么不要犹豫,一定要
使用这些商业级别的中间件所自带的数据库连接池,他们的性能以及调配和开源的不在一个量级,举个例子,曾经有一个项目,数据量比较大,同样的代码应用,在3种开源的连接池里都多少出现过系统异常,而weblogic和websphere的连接池则正常运行,当然后来发现代码有一定瑕疵,但也侧面说明了商业连接池的强大。

1 weblogic的连接池
weblogic 8 是一个让人使用起来很轻松方便的应用服务器软件,但是到了9简直就是折磨,不知道是bea是怎么想的,oracle收购了bea以后出了10,比9强不少,但是最喜欢的还是8。。。
题外话不说了,就以8.1版本介绍一下他的数据库连接池(其实10的配置也差不多)
首先是连接池的基本设置,这个不讲了,网上有很多教程。然后进入Data Sources菜单配置数据源里边的JNDI Name,要和之前在应用配置中的一致:jdbc/myapp。
然后是连接池一些具体项目的配置,包括设置最小(Initial Capacity),最大( Maximum Capacity)连接,以及
每次连接增加时需要一次性增加多少连接(Capacity Increment)。Allow Shrinking(是否把不用的连接退还数据库以保持最小连接数--这个就可以参见之前的连接池阐述的例子进行理解了)。
另外还有几个有意思的选项Test Reserved Connections:对取得的连接进行测试,Test Released Connections:对释放的连接进行测试。有人会问了,这个有什么用啊?
不知道大家在项目中有没有遇到java报连接失效的异常,反正我碰到过,只有在系统压力大的时候才出现。而有了这个选项就不用担心这个问题了--因为连接池已经帮你测试了,一旦检查到连接是无效的他会废弃掉还给数据库,只给你有效的。不过这个连接失效的异常其实多半是应用的不严谨造成的,我们更因该关心应代码的问题--但起码weblogic想到帮你弥补一下,是不是很贴心:)
另外一个重要功能当然是连接池监控:monitor选项卡里可以看到使用情况,有人又要问了,没有什么指标啊,别忘了custom view这个功能链接哦:)
有以下指标:当前连接数、曾经达到的峰值、可以使用的连接数、等待的连接数、从数据库打开的连接数、曾经关闭的连接数。。。其中前3项是我最关注的

使用评价:在具体项目应用中,此连接池的持续运行的稳定性很强,在大并发量的压力下性能也相当优秀,另外在一些异常情况下连接池里的连接也能够及时释放。
          连接池监控一目了然,及时到位。         

2 websphere的连接池
还是先来段题外话:记得有人说过,websphere只有版本6以后才算是websphere,个人很赞同。websphere 5以及以前的版本。。。还是忘了吧。
其实websphere的连接池秉承ibm一贯的风格:功能强大,使用复杂:)
进入控制台使用“JDBC提供程序”功能菜单进行连接池的基本配置,一路下来,不同的数据库配置方式不尽相同,最奇怪的是还要单独手工加上user和password参数,如果没有
资料指导的话还真是摸不着头脑。这些基本设置还是网上找吧很多的。连接池设置完还需要设置数据源,jndi名字一样与之前的对应:jdbc/myapp
高级设置包括初始化连接数,最大连接,连接有效性检查,不使用超时。。其实这些都和weblogic中的连接池配置大致一样。
连接池监控:使用运行监控菜单,里边会有一个监控项目选择,选jdbc监控即可,可恶的是一开始弹出什么服务器操作系统需要安装什么图形化控件,选择是那么就得去找到控件在操作系统(linux)下安装,然后很多的依赖组件都没有。。。搞了半天才发现选择否,监控数据以及图形一样能出来嘛,真是要怒了。
虽然经过一番波折但是监控的内容还是很强大的,就连接池来说一样包括当前连接数、曾经达到的峰值、可以使用的连接数、从数据库打开的连接数、曾经关闭的连接数。。。其中前3项是我最关注的,比较奇怪的现象是应用刚启动的时候已开启的连接数量竟然没有达到初始定义的连接数量,不清楚websphere是怎么个计算机制。
另外在压力大的时候可使用的连接数会是负数,当时很奇怪,想想也了然了,那个负数肯定是排队等待的数量了

使用评价:在具体项目应用中,此连接池的持续运行的稳定性相当强,在大并发量的压力下性能也足够优秀,另外在一些异常情况下连接池里的连接能够及时释放,
          连接池监控配置有些复杂,但是配置好后各项指标一目了然并且有图形显示  
          
总结时刻:
这两种商业级别的连接池都给我留下深刻印象,功能强大,使用稳定,性能优秀,监控到位。可以说难分伯仲,相对而言weblogic的连接池使用配置和监控配置更简单明了,而websphere的更复杂但选项功能也更多一些。其实这正是对两种应用服务器的使用印象的直接反映,当然总体比较2种应用服务器应该又是另一个话题了,也许在下一期的内容里。。。

比较了多种连接池的优劣,下面这个话题可能和比较本身没有直接关系,但个人认为应该是更有价值的一些经验分享吧,那就是---这么多指标配置,那些最大和最小连接数以及其他一些必要的配置指标,在一个正式的生产项目中到底应该配置什么值呢?
其实这个值首先还是要根据具体的项目情况、数据规模以及并发数来制定的(尽管像是套话,但是我们研发人员严谨的作风还是必要的:)。具体而言在中型偏小型的项目--给个数值把,用户数300到3000,数据量100万到1亿---中,建议weblogic设置为最大和最小都是200,websphere最小200最大300,前提是2者设置的最小内存要在1G以上,当然如果条件允许内存越大越好,不过32位机内存1.5G的限制是一定的(64位嘛我愿意设个4G内存过来,速度提升的感觉很爽啊)。这个数字出来以后相信会有不少问题要抛过来,我一一谈一下自己的体验和想法吧
1 为什么是200或300而不是更高?
回答:  再分配多了效果也不大了,一个是应用服务器维持这个连接数需要内存支持,刚才说了32位的机器只能支持到1.5G,并且维护大量的连接进行分配使用对cpu也是一个不小的负荷,因此不宜太大。
2 为什么不小一点?
回答:   如果太小,那么在上述规模项目的并发量以及数据量上来以后会造成排队现象,系统会变慢,数据库连接会经常打开和关闭,性能上有压力,用户体验也不好。
3 为什么weblogic最小最大都一样,而websphere不一样
回答:   其实和分配内存的最小最大值的情况一样,一般都推荐2个值应该一致,都放在内存里就好了嘛。但是ibm官方推荐2个值要有区别---官方说法还是要听的
4 其他开源连接池的分配方案还没说呢?
回答: 开源的个人认为到100就可以了,再高他也不会太稳定,当然1G的最小内存是一定要给tomcat分的
5 还有其他的指标吗?
回答: 当然还有一些,但个人认为剩下的具体情况具体分析了不在这里一一列举了,大家有兴趣可以和我讨论分享一下。

林林总总说了不少希望对大家有帮助,这些比较分析和数据都具备实际应用支撑。

last:

 Druid数据库连接池使用:

阿里巴巴推出的国产数据库连接池,据网上测试对比,比目前的DBCP或C3P0数据库连接池性能更好

 

简单使用介绍

Druid与其他数据库连接池使用方法基本一样(与DBCP非常相似),将数据库的连接信息全部配置给DataSource对象

 

下面给出2种配置方法实例:

1. 纯Java代码创建

dataSource = new DruidDataSource();dataSource.setDriverClassName("com.mysql.jdbc.Driver");dataSource.setUsername("root");dataSource.setPassword("11111111");dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/jspdemo");dataSource.setInitialSize(5);dataSource.setMinIdle(1);dataSource.setMaxActive(10); // 启用监控统计功能 dataSource.setFilters("stat");// for mysql dataSource.setPoolPreparedStatements(false);

 

2. 基于Spring创建

 

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">       <!-- 基本属性 url、user、password -->       <property name="url" value="${jdbc_url}" />       <property name="username" value="${jdbc_user}" />       <property name="password" value="${jdbc_password}" />       <!-- 配置初始化大小、最小、最大 -->       <property name="initialSize" value="1" />       <property name="minIdle" value="1" />       <property name="maxActive" value="20" />       <!-- 配置获取连接等待超时的时间 -->       <property name="maxWait" value="60000" />       <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->       <property name="timeBetweenEvictionRunsMillis" value="60000" />       <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->       <property name="minEvictableIdleTimeMillis" value="300000" />       <property name="validationQuery" value="SELECT 'x'" />       <property name="testWhileIdle" value="true" />       <property name="testOnBorrow" value="false" />       <property name="testOnReturn" value="false" />       <!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->       <property name="poolPreparedStatements" value="true" />       <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />       <!-- 配置监控统计拦截的filters -->       <property name="filters" value="stat" /> </bean>

启用Web监控统计功能需要在Web应用的web.xml中加入这个Servlet声明

  <servlet>       <servlet-name>DruidStatView</servlet-name>       <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>   </servlet>   <servlet-mapping>       <servlet-name>DruidStatView</servlet-name>       <url-pattern>/druid/*</url-pattern>  <servlet-mapping>

通过 http://ip:port/druid/ 地址访问即可

 

项目地址

https://github.com/AlibabaTech/druid/wiki

分享到:
评论

相关推荐

    java项目开发实践经验之二:几种常见数据库连接池的使用比较(转)

    本篇文章将探讨几种常见的数据库连接池的使用比较,包括Proxool、DBCP、C3P0,并通过配置文件(如`proxool.xml`、`dbcp.xml`和`c3p0.xml`)来展示它们的配置细节。 首先,我们来看Proxool,它是一个轻量级的数据库...

    TOMCAT中数据库连接池的几种配置方法_TOMCAT中数据库连接池的几种配置方法_

    本文将详细讲解在Tomcat中配置数据库连接池的几种常见方法,帮助开发者实现高效、稳定的数据库访问。 一、Apache Commons DBCP Apache Commons DBCP是Apache组织提供的一款开源数据库连接池组件,它基于Jakarta-...

    JDBC连接几种数据库的方式

    ### JDBC连接几种数据库的方式 Java Database Connectivity (JDBC) 是 Java 开发者访问关系型数据库的标准接口,通过 JDBC,开发者可以使用 SQL 语句来执行常见的数据库操作,如查询、更新、插入等。本文将详细介绍...

    web中常用数据库连接池

    数据库连接池在Web开发中扮演着至关重要的角色,它是一种管理数据库连接的机制,通过复用已存在的数据库连接,而不是每次请求时都创建新的连接,从而显著提高了应用程序的性能和效率。这一技术对于大型、高并发的Web...

    数据库连接池 jar包

    在Java中,常见的数据库连接池实现有Apache的DBCP、C3P0、HikariCP以及Oracle的UCP等。对于MySQL数据库,通常会使用名为"mysql-connector-java"的JDBC驱动jar包,它是连接MySQL数据库的基础,而连接池的实现则需要...

    java数据库连接池源码及使用示例

    数据库连接池在Java应用中扮演着至关重要的角色,它是一种管理数据库连接的机制,通过复用已存在的数据库连接,减少创建和销毁连接的开销,从而提高系统性能。本资源包含了一个名为`jdbcPool`的手写数据库连接池源码...

    java数据库连接池

    Java数据库连接池(JDBC Connection Pool)是一种管理数据库连接的技术,它允许应用程序重复使用已经存在的数据库连接,而不是每次需要时都创建新的连接。这大大提高了应用程序的性能和效率,因为创建和销毁数据库...

    jdbc+数据库连接池+dbutils

    常见的数据库连接池有C3P0、DBCP等。 ##### C3P0配置 - 配置C3P0可以通过XML文件或者程序中的属性设置来实现。 - XML配置示例: ```xml &lt;c3p0-config&gt; &lt;default-config&gt; &lt;property name="driverClass"&gt;...

    数据库连接池驱动包_数据库连接池驱动包_

    本压缩包包含了几个常见的数据库连接池驱动包,这些驱动包为开发者提供了便捷的方式来处理数据库连接,下面将详细阐述它们的功能和使用。 1. Druid(druid-1.1.10.jar): Druid 是阿里巴巴开源的一个强大、全面且...

    linux C/C++ 数据库连接池

    数据库连接池是一种管理数据库连接的机制,它允许程序重复使用已建立的数据库连接,而不是每次需要时都创建新的连接。这减少了创建和销毁连接的开销,提高了整体系统性能。 在C或C++中实现数据库连接池,通常需要...

    自己写的数据库连接池

    数据库连接池是应用程序管理数据库连接的一种机制,它在多个并发请求之间共享数据库连接,从而减少了创建和销毁数据库连接的开销。在这个项目中,你使用Java实现了一个自定义的数据库连接池,应用了代理模式来优化...

    数据库连接池原理

    为了提高这种交互的效率和减少资源消耗,通常会使用数据库连接池技术。连接池位于应用框架与数据库之间,用于缓存或管理对数据库的连接。 ##### 1.2 数据库连接池的价值 - **不使用连接池的网络交互** - 当执行一...

    JSP高级编程

    概述 &lt;br&gt;1.1 Java技术 &lt;br&gt;1.1.1 Java技术的发展 &lt;br&gt;1.1.2 JavaBeans &lt;br...比较 &lt;br&gt;1.3 JSP开发Web的几种主要方式 &lt;br&gt;1.3.1 直接使用JSP &lt;br&gt;1.3.2 JSP+JavaBeans &lt;br&gt;1.3.3 JSP+JavaBeans+Servlet &lt;br&gt;1.3.4 J2EE...

    数据库连接池的应用与研究

    本文将深入探讨数据库连接池的应用与研究,包括其原理、优点、常见实现以及如何在实际项目中有效地利用它。 首先,我们要理解数据库连接池的基本概念。数据库连接池是一种管理数据库连接的技术,它在应用程序启动时...

    Java数据库连接池的原理与应用.pdf

    在使用数据库连接池时,常见的连接池实现有DBCP、C3p0、TomcatJdbcPool、BoneCP和Druid等。以DBCP为例,使用它需要导入commons-dbcp.jar和commons-pool.jar包。在Maven项目中,需要在pom.xml配置文件中添加相应的...

    JNDI的数据库连接池 pdf

    在Java环境下,利用JNDI(Java Naming and Directory Interface)进行数据库连接池的配置是非常常见的做法。JNDI提供了一种统一的方式来查找和管理各种命名服务和目录服务,包括数据库连接。下面通过一个具体的例子...

    Java各数据库连接池配置介绍

    Java数据库连接池是管理数据库连接的一种机制,它可以有效地复用数据库连接,避免每次数据库操作时创建和销毁连接的开销,从而提高了应用的性能。在Java中,有多种数据库连接池实现,包括C3P0、DBCP和Proxool等。 *...

    数据库连接池代码

    常见的Java数据库连接池实现有以下几种: 1. C3P0:开源的JDBC连接池,提供了强大的配置选项和异常处理机制。 2. DBCP (Apache Commons DBCP):Apache组织提供的基础连接池实现,基于Jakarta Pool框架。 3. ...

    JDBC连接数据库经验集萃

    - 遵循最佳实践,如使用连接池管理数据库连接,提高性能和资源利用效率。 - 处理异常,确保程序的健壮性。 - 使用预编译的SQL语句(PreparedStatement)以防止SQL注入攻击。 - 关闭不再使用的连接,以释放资源。 ...

Global site tag (gtag.js) - Google Analytics