您的位置:首页 > 编程语言 > Java开发

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

2018-03-05 19:34 483 查看
如今经常使用的开源数据库连接池主要有c3p0、dbcp、proxool三种,当中:Spring                         推荐使用dbcp;Hibernate                  推荐使用c3p0和proxool; 1、  DBCP:ApacheDBCP(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操作通过帮助进程完毕。扩展这些操作能够有效的提升性能。眼下使用它的开源项目有Hibernate,Spring等。c3p0有自己主动回收空暇连接功能。 3、  Proxool:SourceforgeProxool是一种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?<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"  
  xmlns:jee="http://www.springframework.org/schema/jee"   
xsi:schemaLocation="http://www.springframework.org/schema/beans  
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd              http://www.springframework.org/schema/context              http://www.springframework.org/schema/context/spring-context-2.5.xsd              http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd   
            http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd                 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">   <context:property-placeholder location="classpath:jdbc_config.properties"/>  
<!--   
  DriverManagerDataSource:在每一个连接请求时新建一个连接。  
  SingleConnectionDataSource:在每一个连接请求时都返回同一连接。  
  -->  
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
  <property name="driverClassName" value="${driverClassName}"/>  
  <property name="url" value="${url}"/>  
  <property name="username" value="${username}"/>  
  <property name="password" value="${password}"/>  
</bean>   
</beans>  

配置DBCPview plaincopy to clipboardprint?<context:property-placeholder location="classpath:dbcp_config.properties" />  
  <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"  
  destroy-method="close">  
  <property name="driverClassName" value="${driverClassName}"/>  
  <property name="url" value="${url}"/>  
  <property name="username" value="${username}"/>  
  <property name="password" value="${password}"/>  
  <property name="initialSize" value="${initialSize}"/>  
  <property name="maxActive" value="${maxActive}"/>  
  <property name="maxIdle" value="${maxIdle}"/>  
  <property name="minIdle" value="${minIdle}"/>  
  <property name="maxWait" value="${maxWait}"/>  
  <property name="defaultAutoCommit" value="${defaultAutoCommit}"/>  
</bean>  
  
配置C3p0
view plaincopy to clipboardprint?<context:property-placeholder location="classpath:c3p0_config.properties"/>  
<bean id="dataSource"  
  class="com.mchange.v2.c3p0.ComboPooledDataSource">  
  <property name="user" value="${user}"/>   
  <property name="password" value="${password}"/>   
  <property name="jdbcUrl" value="${jdbcUrl}"/>   
  <property name="driverClass" value="${driverClass}"/>   
    
  <property name="checkoutTimeout" value="${checkoutTimeout}"/>   
  <property name="idleConnectionTestPeriod" value="${idleConnectionTestPeriod}"/>   
  <property name="initialPoolSize" value="${initialPoolSize}"/>   
  <property name="maxIdleTime" value="${maxIdleTime}"/>   
    
  <property name="maxPoolSize" value="${maxPoolSize}"/>   
  <property name="minPoolSize" value="${minPoolSize}"/>   
  <property name="maxStatements" value="${maxStatements}"/>   
</bean>  
  

配置jndi
view plaincopy to clipboardprint?  
<!--    
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"  
  scope="singleton">  
  <property name="jndiName" value="/jdbc/spring-jndi" />  
  < !--  
   当resourceRef 属性为true时,jndiName会被加入java:comp/env/。从应用server的JNDI文件夹获取数据源  
  -- >  
  <property name="resourceRef" ref="true" />  
</bean>  
-->  
<!-- jee 命名空间里的jee:jndi-lookup 元素能够从jndi获取对象。以下的XML等效于前面对JndiObjectFactoryBean的明白声明 -->  
<jee:jndi-lookup id="dataSource" jndi-name="/jdbc/spring-jndi" resource-ref="true"/>  
  

測试使用一下 
view plaincopy to clipboardprint?<import resource="classpath:bean-dbcp.xml" />  
<bean id="helloJdbcDao" class="cn.partner4java.jdbc.impl.HelloJdbcDaoBean">  
  <property name="dataSource" ref="dataSource"/>  
</bean>  
  

。。。。。。 
view plaincopy to clipboardprint?package cn.partner4java.jdbc;  
import java.sql.Connection;  
import java.sql.SQLException;  
/** 
* 存jdbc练习 
* @author wangchanglong 

*/  
public interface HelloJdbcDao {  
public Connection getConnection() throws SQLException;  
}  
  

。。。。。。 
view plaincopy to clipboardprint?package cn.partner4java.jdbc.impl;  
import java.sql.Connection;  
import java.sql.SQLException;  
import javax.sql.DataSource;  
import cn.partner4java.jdbc.HelloJdbcDao;  
/** 
* 最简单的练习 
* @author wangchanglong 

*/  
public class HelloJdbcDaoBean implements HelloJdbcDao{  
public DataSource dataSource;  
public void setDataSource(DataSource dataSource) {  
  this.dataSource = dataSource;  
}  
public Connection getConnection() throws SQLException {  
  return dataSource.getConnection();  
}  
  
}  
  

。。。。。 
view plaincopy to clipboardprint?package cn.partner4java.jdbc.junit;  
import java.sql.SQLException;  
import org.springframework.context.ApplicationContext;  
import org.springframework.context.support.ClassPathXmlApplicationContext;  
import cn.partner4java.jdbc.HelloJdbcDao;  
import junit.framework.TestCase;  
public class HelloJdbcDaoBeanTest extends TestCase {  
public HelloJdbcDao helloJdbcDao;  
@Override  
protected void setUp() throws Exception {  
  ApplicationContext ac = new ClassPathXmlApplicationContext("beans-jdbc.xml");  
  helloJdbcDao = (HelloJdbcDao) ac.getBean("helloJdbcDao");  
}  
  
public void testGetConn() throws SQLException{  
  System.out.println(helloJdbcDao.getConnection());  
}  
  
}  
  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: