`

数据库连接池优化与配置

 
阅读更多
转自: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> 
分享到:
评论

相关推荐

    几种数据库连接池详细配置

    在IT领域,数据库连接池是优化数据库访问性能的关键技术之一,尤其在高并发的应用场景下,合理配置数据库连接池能够显著提升系统响应速度并降低资源消耗。本文将深入解析几种常用的数据库连接池——Apache DBCP、C3P...

    C#高效数据库连接池源码

    数据库连接池是数据库管理中的重要概念,特别是在高并发和大数据量的应用场景下,它能显著提升性能并降低系统资源消耗。在C#编程环境中,我们可以使用自定义的数据库连接池来实现这一功能。本篇文章将深入探讨“C#...

    Tomcat5的数据库连接池配置Tomcat5的数据库连接池配置

    数据库连接池的正确配置对于基于Tomcat的应用而言至关重要,不仅能有效提高系统的响应速度,还能优化资源使用,减少服务器负担。通过遵循上述步骤,开发者可以顺利完成Tomcat5.0.25下的数据库连接池配置,从而构建出...

    03-数据库连接池驱动_数据库连接池;驱动_

    本资源"03-数据库连接池驱动"包含了三种常用的数据库连接池驱动:C3P0、Druid和DBCP,它们都是为了优化数据库连接管理和复用而设计的。 首先,C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3...

    c# mysql数据库连接池实现

    本文将深入探讨如何在C#中使用MySQL数据库连接池。 首先,我们需要了解什么是数据库连接池。数据库连接池是一种资源管理技术,它预先创建并维护一定数量的数据库连接,当应用需要时,可以从池中获取连接,使用完毕...

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

    总结来说,选择和配置合适的数据库连接池对于Java应用程序的性能至关重要。不同的连接池有不同的特性和优化选项,开发者需要根据实际应用的需求和性能指标来选择和调整。正确配置这些参数可以确保连接池的高效运行,...

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

    数据库连接池是现代数据库应用程序中的重要组成部分,它有效地管理和优化了数据库连接的创建、分配和回收,从而提高系统的性能和资源利用率。本压缩包包含了几个常见的数据库连接池驱动包,这些驱动包为开发者提供了...

    JSP数据库连接池技术与应用

    本文将深入探讨JSP如何与数据库连接池技术结合,以及它们在实际应用中的作用。 一、数据库连接池概念 数据库连接池是管理数据库连接的一种机制,它预先创建并维护一定数量的数据库连接,当应用需要时,可以从池中...

    JAVA数据库连接池

    Java数据库连接池是Java开发中一个非常重要的技术,它主要用于管理数据库连接,提高数据库操作...通过深入学习《最新修改java数据库连接池原理与应用(陈迁小组)》这份资料,你将对数据库连接池有更全面、深入的理解。

    C# 数据库连接池

    数据库连接池是一组预先初始化的数据库连接,当程序需要与数据库建立连接时,可以从池中获取一个已经存在的连接,而不是每次都创建新的连接。使用完毕后,连接不会立即关闭,而是返回到连接池中供后续使用。这样可以...

    普元平台使用阿里druid数据库连接池的配置说明20171010.docx

    阿里Druid数据库连接池...在配置 Druid 数据库连接池时,需要根据实际情况进行调整和优化,以提高性能和可靠性。 在普元平台中,使用 Druid 数据库连接池可以提高数据源的性能和可靠性,提高系统的整体性能和稳定性。

    Struts框架中使用数据库连接池

    在Struts中,通过配置数据库连接池,可以有效地管理和优化数据库连接资源。 #### 配置数据库连接池 在Struts框架中,数据库连接池的配置通常是在`struts-config.xml`或专门的配置文件中进行的。配置项包括但不限于...

    数据库连接池的配置 完整版

    在本“数据库连接池的配置 完整版”压缩包中,包含了三个配置文件(假设为xxx.xml)以及一个说明文档,旨在帮助开发者理解和实践数据库连接池的配置过程。 首先,我们需要了解数据库连接池的基本概念。数据库连接池...

    数据库连接池的例子数据库连接池的例子

    数据库连接池是应用程序管理数据库连接的一种机制,它提高了数据库访问的效率和资源利用率。通过复用已建立的数据库连接,避免了频繁创建和关闭连接所消耗的时间和系统资源。连接池的基本思想是预先创建一定数量的...

    JAVA 完整的数据库连接池实现

    本文将详细介绍如何在 Java 中实现一个完整的数据库连接池,并探讨其核心概念、工作原理以及如何根据需求进行配置。 首先,我们需要理解数据库连接池的基本概念。数据库连接池是一种对象池设计模式的应用,它维护了...

    基于Java的数据库连接池设计与优化.pdf

    基于Java的数据库连接池设计与优化技术可以极大地提高数据库的访问效率,实现了对连接池的灵活配置和 tinh动管理。本文提出的动态连接池的优化模型可以满足系统的实际需要,提高系统的性能和可靠性。

    论WebSphere中流行数据库连接池的配置.doc

    在WebSphere应用服务器中,数据库连接池的配置是实现高效数据库访问的关键步骤。连接池管理数据库连接,避免了频繁创建和关闭连接的开销,提高了系统的性能和响应速度。本文主要讨论了在WebSphere中配置Oracle、SQL ...

    数据库连接池java代码实现

    总结来说,数据库连接池通过Java代码实现的核心包括连接池的初始化、连接的获取与释放、以及资源的管理和监控。通过自定义连接池,我们可以控制连接的生命周期,优化资源使用,从而提高应用的性能和稳定性。在实际...

Global site tag (gtag.js) - Google Analytics