MyException - 我的异常网
当前位置:我的异常网» 数据库 » 数据库连接池优化与配备

数据库连接池优化与配备

www.MyException.Cn  网友分享于:2015-08-26  浏览:8次
数据库连接池优化与配置
转自:http://benlee.javaeye.com/blog/345765
概述

  目前数据库连接池产品是非常多的,DBCP、C3P0、Proxool等都是非常优秀的产品。连接池的性能和稳定性会对我们的程序造成极大的影响,因此,有必要对这些连接池产品进行一些选择。另外,连接池的配置是否恰当,将会决定该连接池的性能和稳定性表现,所以,本文将给出连接池配置的一些要点。在这些连接池产品中作出选择是比较困难的,每个优秀的产品都有它自身的特点,而且也很难找出一个在各种运行环境中都最表现最优的产品,因此,本文将选出一些目前来说比较优秀的产品,简要介绍一下它们的配置要点,以及如何使用在我们的项目中。至于在生产环境中,哪种产品会表现最好,则...。

  Hibernate开发组推荐使用c3p0,spring开发组推荐使用dbcp(dbcp连接池有weblogic连接池同样的问题,就是强行关闭连接或数据库重启后,无法reconnect,但可通过配置来解决),Hibernate in action推荐使用c3p0和proxool。其它还有不少商业产品,但性能与稳定性的整体表现反而不如这些开源数据库连接池。从网上的搜索情况来看,也是DBCP、C3P0、Proxool的使用较为广泛。但是关于它们的性能与稳定性,众说不一,难以得到结论。
  DBCP是Apache出品的,开发也较为活跃,也是使用极为广泛的一个数据库连接池产品。从网上搜索的资料以及自己以往使用DBCP的经验来看,DBCP的稳定性有些问题。但是它的开发较为活跃,所以我们可以相信它会解决这些问题,而且有些问题是可以通过额外的配置来解决的。
  C3P0,稳定性似乎不错,在这方面似乎有很好的口碑。至于性能,应该不是最好的,算是中规中矩的类型。
  Proxool的口碑似乎很好,不大见到负面的评价,从官方资料上来看,有许多有用的特性和特点,也是许多人推荐的。但是开发不够活跃,使用者也较少。
  我选定这三个产品作为我们系统的数据库连接池,并使用Proxool作为目前开发环境中的连接池产品(Proxool便于监控)。
使用和配置

使用

  三个产品都能很方便地整合到Springframework中,也都可以配置为JNDI资源,因此,它们可以随意更换,不会影响程序代码。在生产环境中,如果需要开放我们的数据库给其它系统使用或共享,我推荐使用应用服务器的JNDI。在开发环境中,我们不使用JNDI。以下的配置是不使用 JNDI时的Spring配置,至于JNDI的配置,请参考相关文档,该文不做叙述,但配置项基本相同。
DBCP

  DBCP是Apache的一个开源项目(http://jakarta.apache.org/commons/dbcp /index.html),它依赖Apache的另外2个开源项目:commons.collections和commons.pool。下载这些包并将这些包的路径添加到classpath中就可以使用dbcp做为项目中的数据库连接池使用了。在我们的项目中,可通过Maven来管理。
  在配置时,不常用但在生产环境中很有用的参数有:removeAbandoned 、removeAbandonedTimeout、maxWait。如果设置了rmoveAbandoned=true,那么在 getNumActive()快要到getMaxActive()的时候,系统会进行无效的Connection的回收,回收的 Connection为removeAbandonedTimeout(默认300秒)中设置的秒数后没有使用的Connection。
  如果设置了logAbandoned=true,DBCP将会在回收Connection之后,打印回收Connection的错误信息,包括在哪个地方用了Connection却忘记关闭了这样的信息,在调试的时候很有用。
  基本配置如下:
Xml代码

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName" value="${db.driverClassName}"/> 
    <property name="url" value="${db.url}"/> 
    <property name="username" value="${db.username}"/> 
    <property name="password" value="${db.password}"/> 
    <!--initialSize: 初始化连接--> 
    <property name="initialSize" value="5"/> 
    <!--maxIdle: 最大空闲连接--> 
    <property name="maxIdle" value="10"/> 
    <!--minIdle: 最小空闲连接--> 
    <property name="minIdle" value="5"/> 
    <!--maxActive: 最大连接数量--> 
    <property name="maxActive" value="15"/> 
    <!--removeAbandoned: 是否自动回收超时连接--> 
    <property name="removeAbandoned" value="true"/> 
    <!--removeAbandonedTimeout: 超时时间(以秒数为单位)--> 
    <property name="removeAbandonedTimeout" value="180"/> 
    <!--maxWait: 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒--> 
    <property name="maxWait" value="3000"/> 
    <property name="validationQuery"> 
    <value>SELECT 1</value> 
    </property> 
    <property name="testOnBorrow"> 
    <value>true</value> 
    </property> 
    </bean> 


C3P0

  C3P0受到不少人的推荐,官方地址是:http://sourceforge.net/projects/c3p0。基本配置如下:
Xml代码

    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
      <property name="driverClass" value="${db.driverClassName}"/> 
      <property name="jdbcUrl" value="${db.url}"/> 
    <!-- 
      <property name="user" value="${db.user}"/> 
      <property name="password" value="${db.pass}"/> 
    --> 
      <property name="properties"> 
        <props> 
          <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3--> 
          <prop key="c3p0.acquire_increment">5</prop> 
          <!--每60秒检查所有连接池中的空闲连接。Default: 0 -->  
          <prop key="c3p0.idle_test_period">60</prop> 
          <prop key="c3p0.max_size">15</prop> 
          <prop key="c3p0.max_statements">0</prop> 
          <prop key="c3p0.min_size">10</prop> 
          <prop key="user">${db.user}</prop> 
          <prop key="password">${db.pass}</prop> 
        </props> 
      </property> 
    </bean> 


Proxool

  这是一个Java SQL Driver驱动程序,可以透明地为你现存的JDBC驱动程序增加连接池的功能。另外它提供一个Web监控程序,可以实时的查看你系统所有连接池的使用情况。官方地址:http://proxool.sourceforge.net。Proxool的配置方式有多种,类似于以上配置的方式如下:
Xml代码

    <bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource" destroy-method="close"> 
      <property name="driver" value="${db.driverClassName}"/> 
      <property name="driverUrl" value="${db.url}"/> 
     <!-- 用户名和密码写在一起才调用成功,不然会报 调用无效的参数 错误,下面设置用户名和密码的property好像是无效的,其它数据库也是这样 
     比如mysql的也要把用户名和密码写在url里:<property name="driverUrl" value="jdbc:mysql://localhost:3306/blogdb?user=lizongbo&amp;password=lizongbo" /> 
     --> 
      <property name="user" value="${db.user}"/> 
      <property name="password" value="${db.pass}"/> 
      <property name="alias" value="${db.alias}"/> 
      <property name="houseKeepingSleepTime" value="90000"/> 
      <property name="prototypeCount" value="5"/> 
      <property name="maximumConnectionCount" value="100"/> 
      <property name="minimumConnectionCount" value="10"/> 
      <property name="trace" value="true"/> 
      <property name="verbose" value="true"/> 
    </bean> 


  另外,也可以在单独的一个文件中配置Proxool。比如,在WEB-INF/下建立proxool.xml文件:
Xml代码

    <?xml version="1.0" encoding="UTF-8"?> 
    <proxool-config> 
      <proxool> 
        <alias>mimir</alias> 
        <driver-url>jdbc:mysql://localhost:3306/dbname?user=username&amp;passwordpassword= password"</driver-url> 
        <driver-class>com.mysql.jdbc.Driver</driver-class> 
        <driver-properties> 
          <property name="user" value="username"/> 
          <property name="password" value="password"/> 
        </driver-properties> 
        <maximum-connection-count>10</maximum-connection-count> 
        <house-keeping-test-sql>select 1 from dual</house-keeping-test-sql> 
      </proxool> 
    </proxool-config> 


  然后,需要在应用系统启动时读入这个文件。Proxool提供了一个Servlet来做这个事情,编辑WEB-INF/web.xml,加入以下几行:
Xml代码

    <servlet> 
      <servlet-name>proxoolServletConfigurator</servlet-name> 
      <servlet-class>org.logicalcobwebs.proxool.configuration.ServletConfigurator</servlet-class> 
      <init-param> 
        <param-name>xmlFile</param-name> 
        <param-value>WEB-INF/proxool.xml</param-value> 
      </init-param> 
      <load-on-startup>1</load-on-startup> 
    </servlet> 


  然后,在Spring的配置中可以这样写:
Xml代码

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
      <property name="driverClassName" value="org.logicalcobwebs.proxool.ProxoolDriver"/> 
      <property name="url" value="proxool.xxx"/> 
    </bean> 


  如果需要监控,可以在WEB-INF/web.xml中加上:
Xml代码

    <servlet> 
      <servlet-name>proxooladmin</servlet-name> 
      <servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
      <servlet-name>proxooladmin</servlet-name> 
      <url-pattern>/proxooladmin</url-pattern> 
    </servlet-mapping> 

文章评论

Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
中美印日四国程序员比较
中美印日四国程序员比较
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
编程语言是女人
编程语言是女人
一个程序员的时间管理
一个程序员的时间管理
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
程序员都该阅读的书
程序员都该阅读的书
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
10个调试和排错的小建议
10个调试和排错的小建议
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
Java程序员必看电影
Java程序员必看电影
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
每天工作4小时的程序员
每天工作4小时的程序员
代码女神横空出世
代码女神横空出世
程序员必看的十大电影
程序员必看的十大电影
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
我的丈夫是个程序员
我的丈夫是个程序员
总结2014中国互联网十大段子
总结2014中国互联网十大段子
我是如何打败拖延症的
我是如何打败拖延症的
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
 程序员的样子
程序员的样子
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
程序员和编码员之间的区别
程序员和编码员之间的区别
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
那些争议最大的编程观点
那些争议最大的编程观点
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
程序员的鄙视链
程序员的鄙视链
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
鲜为人知的编程真相
鲜为人知的编程真相
旅行,写作,编程
旅行,写作,编程
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
为什么程序员都是夜猫子
为什么程序员都是夜猫子
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有