首页 > 代码库 > Spring整合HIbernate时,三种数据库连接池的配置和比较

Spring整合HIbernate时,三种数据库连接池的配置和比较

现在常用的开源数据库连接池主要有c3p0dbcpproxool三种,其中:

Spring                         推荐使用dbcp

Hibernate                  推荐使用c3p0proxool 

1、  DBCPApache

DBCP(DataBase connection pool)数据库连接池。是Apache上的一个 java连接池项目,也是 tomcat使用的连接池组件。单独使用dbcp需要3个包:common-dbcp.jar,common-pool.jar,common-collections.jar由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。dbcp没有自动的去回收空闲连接的功能。 

2、  C3P0

C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。c3p0是异步操作的,缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能。目前使用它的开源项目有HibernateSpring等。c3p0有自动回收空闲连接功能。 

3、  ProxoolSourceforge

Proxool是一种Java数据库连接池技术。是sourceforge下的一个开源项目,这个项目提供一个健壮、易用的连接池,最为关键的是这个连接池提供监控的功能,方便易用,便于发现连接泄漏的情况。 

对比:

1>     相同时间内同等量的线程数和循环次数下:通过对三个连接池的三个标志性性能测试参数(Average,median,90%Line)进行比较发现:性能dbcp<=c3p0<proxool 

2>     不同情况下的同一数据库连接池测试:通过观察 Average,median,90%Line三个参数发

现三个连接池的稳定性(三种连接池的三个测试参数的变化情况)依次:稳定性dbcp>=c3p0>proxool 

结论:   

通过对三种数据库连接池的性能测试发现,proxool c3p0能够更好的支持高并发,但是在稳定性方面略逊于 dpcp;


各种连接池的配置:


未配置连接池的情况:

view plaincopy to clipboardprint?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
  4. xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"  
  5.   xmlns:jee="http://www.springframework.org/schema/jee"   
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans  
  7.            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  8.            http://www.springframework.org/schema/context  
  9.            http://www.springframework.org/schema/context/spring-context-2.5.xsd  
  10.            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd   
  11.             http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd    
  12.             http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">  
  13. <context:property-placeholder location="classpath:jdbc_config.properties"/>  
  14. <!--   
  15.   DriverManagerDataSource:在每个连接请求时新建一个连接。  
  16.   SingleConnectionDataSource:在每个连接请求时都返回同一连接。  
  17.   -->  
  18. <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
  19.   <property name="driverClassName" value=http://www.mamicode.com/"${driverClassName}"/>  
  20.   <property name="url" value=http://www.mamicode.com/"${url}"/>  
  21.   <property name="username" value=http://www.mamicode.com/"${username}"/>  
  22.   <property name="password" value=http://www.mamicode.com/"${password}"/>  
  23. </bean>   
  24. </beans>  

配置DBCP

view plaincopy to clipboardprint?
  1. <context:property-placeholder location="classpath:dbcp_config.properties" />  
  2.   <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"  
  3.   destroy-method="close">  
  4.   <property name="driverClassName" value=http://www.mamicode.com/"${driverClassName}"/>  
  5.   <property name="url" value=http://www.mamicode.com/"${url}"/>  
  6.   <property name="username" value=http://www.mamicode.com/"${username}"/>  
  7.   <property name="password" value=http://www.mamicode.com/"${password}"/>  
  8.   <property name="initialSize" value=http://www.mamicode.com/"${initialSize}"/>  
  9.   <property name="maxActive" value=http://www.mamicode.com/"${maxActive}"/>  
  10.   <property name="maxIdle" value=http://www.mamicode.com/"${maxIdle}"/>  
  11.   <property name="minIdle" value=http://www.mamicode.com/"${minIdle}"/>  
  12.   <property name="maxWait" value=http://www.mamicode.com/"${maxWait}"/>  
  13.   <property name="defaultAutoCommit" value=http://www.mamicode.com/"${defaultAutoCommit}"/>  
  14. </bean>  
  15.   
配置C3p0
view plaincopy to clipboardprint?
  1. <context:property-placeholder location="classpath:c3p0_config.properties"/>  
  2. <bean id="dataSource"  
  3.   class="com.mchange.v2.c3p0.ComboPooledDataSource">  
  4.   <property name="user" value=http://www.mamicode.com/"${user}"/>   
  5.   <property name="password" value=http://www.mamicode.com/"${password}"/>   
  6.   <property name="jdbcUrl" value=http://www.mamicode.com/"${jdbcUrl}"/>   
  7.   <property name="driverClass" value=http://www.mamicode.com/"${driverClass}"/>   
  8.     
  9.   <property name="checkoutTimeout" value=http://www.mamicode.com/"${checkoutTimeout}"/>   
  10.   <property name="idleConnectionTestPeriod" value=http://www.mamicode.com/"${idleConnectionTestPeriod}"/>   
  11.   <property name="initialPoolSize" value=http://www.mamicode.com/"${initialPoolSize}"/>   
  12.   <property name="maxIdleTime" value=http://www.mamicode.com/"${maxIdleTime}"/>   
  13.     
  14.   <property name="maxPoolSize" value=http://www.mamicode.com/"${maxPoolSize}"/>   
  15.   <property name="minPoolSize" value=http://www.mamicode.com/"${minPoolSize}"/>   
  16.   <property name="maxStatements" value=http://www.mamicode.com/"${maxStatements}"/>   
  17. </bean>  
  18.   

配置jndi
view plaincopy to clipboardprint?
  1.   
  2. <!--    
  3. <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"  
  4.   scope="singleton">  
  5.   <property name="jndiName" value=http://www.mamicode.com/"/jdbc/spring-jndi" />  
  6.   < !--  
  7.    当resourceRef 属性为true时,jndiName会被添加java:comp/env/,从应用服务器的JNDI目录获取数据源  
  8.   -- >  
  9.   <property name="resourceRef" ref="true" />  
  10. </bean>  
  11. -->  
  12. <!-- jee 命名空间里的jee:jndi-lookup 元素可以从jndi获取对象。下面的XML等效于前面对JndiObjectFactoryBean的明确声明 -->  
  13. <jee:jndi-lookup id="dataSource" jndi-name="/jdbc/spring-jndi" resource-ref="true"/>  
  14.   

测试使用一下 

view plaincopy to clipboardprint?
  1. <import resource="classpath:bean-dbcp.xml" />  
  2. <bean id="helloJdbcDao" class="cn.partner4java.jdbc.impl.HelloJdbcDaoBean">  
  3.   <property name="dataSource" ref="dataSource"/>  
  4. </bean>  
  5.   

。。。。。。 
view plaincopy to clipboardprint?
  1. package cn.partner4java.jdbc;  
  2. import java.sql.Connection;  
  3. import java.sql.SQLException;  
  4. /** 
  5. * 存jdbc练习 
  6. * @author wangchanglong 
  7. * 
  8. */  
  9. public interface HelloJdbcDao {  
  10. public Connection getConnection() throws SQLException;  
  11. }  
  12.   

。。。。。。 
view plaincopy to clipboardprint?
  1. package cn.partner4java.jdbc.impl;  
  2. import java.sql.Connection;  
  3. import java.sql.SQLException;  
  4. import javax.sql.DataSource;  
  5. import cn.partner4java.jdbc.HelloJdbcDao;  
  6. /** 
  7. * 最简单的练习 
  8. * @author wangchanglong 
  9. * 
  10. */  
  11. public class HelloJdbcDaoBean implements HelloJdbcDao{  
  12. public DataSource dataSource;  
  13. public void setDataSource(DataSource dataSource) {  
  14.   this.dataSource = dataSource;  
  15. }  
  16. public Connection getConnection() throws SQLException {  
  17.   return dataSource.getConnection();  
  18. }  
  19.   
  20. }  
  21.   

。。。。。 
view plaincopy to clipboardprint?
  1. package cn.partner4java.jdbc.junit;  
  2. import java.sql.SQLException;  
  3. import org.springframework.context.ApplicationContext;  
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  5. import cn.partner4java.jdbc.HelloJdbcDao;  
  6. import junit.framework.TestCase;  
  7. public class HelloJdbcDaoBeanTest extends TestCase {  
  8. public HelloJdbcDao helloJdbcDao;  
  9. @Override  
  10. protected void setUp() throws Exception {  
  11.   ApplicationContext ac = new ClassPathXmlApplicationContext("beans-jdbc.xml");  
  12.   helloJdbcDao = (HelloJdbcDao) ac.getBean("helloJdbcDao");  
  13. }  
  14.   
  15. public void testGetConn() throws SQLException{  
  16.   System.out.println(helloJdbcDao.getConnection());  
  17. }  
  18.   
  19. }  
  20.