目前数据库连接池产品是非常多的,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代码 1. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 2. <property name="driverClassName" value="${db.driverClassName}"/> 3. <property name="url" value="${db.url}"/> 4. <property name="username" value="${db.username}"/> 5. <property name="password" value="${db.password}"/> 6. <!--initialSize: 初始化连接--> 7. <property name="initialSize" value="5"/> 8. <!--maxIdle: 最大空闲连接--> 9. <property name="maxIdle" value="10"/> 10. <!--minIdle: 最小空闲连接--> 11. <property name="minIdle" value="5"/> 12. <!--maxActive: 最大连接数量--> 13. <property name="maxActive" value="15"/> 14. <!--removeAbandoned: 是否自动回收超时连接--> 15. <property name="removeAbandoned" value="true"/> 16. <!--removeAbandonedTimeout: 超时时间(以秒数为单位)--> 17. <property name="removeAbandonedTimeout" value="180"/> 18. <!--maxWait: 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒--> 19. <property name="maxWait" value="3000"/> 20. <property name="validationQuery"> 21. <value>SELECT 1</value> 22. </property> 23. <property name="testOnBorrow"> 24. <value>true</value> 25. </property> 26. </bean> <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代码 1. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 2. <property name="driverClass" value="${db.driverClassName}"/> 3. <property name="jdbcUrl" value="${db.url}"/> 4. <!-- 5. <property name="user" value="${db.user}"/> 6. <property name="password" value="${db.pass}"/> 7. --> 8. <property name="properties"> 9. <props> 10. <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3--> 11. <prop key="c3p0.acquire_increment">5</prop> 12. <!--每60秒检查所有连接池中的空闲连接。Default: 0 --> 13. <prop key="c3p0.idle_test_period">60</prop> 14. <prop key="c3p0.max_size">15</prop> 15. <prop key="c3p0.max_statements">0</prop> 16. <prop key="c3p0.min_size">10</prop> 17. <prop key="user">${db.user}</prop> 18. <prop key="password">${db.pass}</prop> 19. </props> 20. </property> 21. </bean> <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代码 1. <bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource" destroy-method="close"> 2. <property name="driver" value="${db.driverClassName}"/> 3. <property name="driverUrl" value="${db.url}"/> 4. <!--用户名和密码写在一起才调用成功,不然会报 调用无效的参数 错误,下面设置用户名和密码的property好像是无效的,其它数据库也是这样 5. 比如mysql的也要把用户名和密码写在url里:<property name="driverUrl" value="jdbc:mysql://localhost:3306/blogdb?user=lizongbo&password=lizongbo" /> 6. --> 7. <property name="user" value="${db.user}"/> 8. <property name="password" value="${db.pass}"/> 9. <property name="alias" value="${db.alias}"/> 10. <property name="houseKeepingSleepTime" value="90000"/> 11. <property name="prototypeCount" value="5"/> 12. <property name="maximumConnectionCount" value="100"/> 13. <property name="minimumConnectionCount" value="10"/> 14. <property name="trace" value="true"/> 15. <property name="verbose" value="true"/> 16. </bean> <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&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代码 1. <?xml version="1.0" encoding="UTF-8"?> 2. <proxool-config> 3. <proxool> 4. <alias>mimir</alias> 5. <driver-url>jdbc:mysql://localhost:3306/mimirdb?user=mimir&password=mimir"</driver-url> 6. <driver-class>com.mysql.jdbc.Driver</driver-class> 7. <driver-properties> 8. <property name="user" value="mimir"/> 9. <property name="password" value="mimir"/> 10. </driver-properties> 11. <maximum-connection-count>10</maximum-connection-count> 12. <house-keeping-test-sql>select 1 from dual</house-keeping-test-sql> 13. </proxool> 14. </proxool-config> <?xml version="1.0" encoding="UTF-8"?> <proxool-config> <proxool> <alias>mimir</alias> <driver-url>jdbc:mysql://localhost:3306/mimirdb?user=mimir&password=mimir"</driver-url> <driver-class>com.mysql.jdbc.Driver</driver-class> <driver-properties> <property name="user" value="mimir"/> <property name="password" value="mimir"/> </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代码 1. <servlet> 2. <servlet-name>proxoolServletConfigurator</servlet-name> 3. <servlet-class>org.logicalcobwebs.proxool.configuration.ServletConfigurator</servlet-class> 4. <init-param> 5. <param-name>xmlFile</param-name> 6. <param-value>WEB-INF/proxool.xml</param-value> 7. </init-param> 8. <load-on-startup>1</load-on-startup> 9. </servlet> <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代码 1. <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 2. <property name="driverClassName" value="org.logicalcobwebs.proxool.ProxoolDriver"/> 3. <property name="url" value="proxool.mimir"/> 4. </bean> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="org.logicalcobwebs.proxool.ProxoolDriver"/> <property name="url" value="proxool.mimir"/> </bean> 如果需要监控,可以在WEB-INF/web.xml中加上: Xml代码 1. <servlet> 2. <servlet-name>proxooladmin</servlet-name> 3. <servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class> 4. </servlet> 5. <servlet-mapping> 6. <servlet-name>proxooladmin</servlet-name> 7. <url-pattern>/proxooladmin</url-pattern> 8. </servlet-mapping> |
数据库连接池
最新推荐文章于 2020-05-29 17:05:47 发布