如今經常使用的開源數據庫連接池主要有c3p0、dbcp、proxool三種,當中:
Spring 推薦使用dbcp;
Hibernate 推薦使用c3p0和proxool;
1、 DBCP:Apache
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操作通過幫助進程完畢。
擴展這些操作能夠有效的提升性能。
眼下使用它的開源項目有Hibernate,Spring等。c3p0有自己主動回收空暇連接功能。
3、 Proxool:Sourceforge
Proxool是一種Java數據庫連接池技術。是sourceforge下的一個開源項目,這個項目提供一個健壯、易用的連接池。最為關鍵的是這個連接池提供監控的功能,方便易用,便於發現連接泄漏的情況。
對照:
1> 同樣時間內同等量的線程數和循環次數下:通過對三個連接池的三個標志性性能測試參數(Average,median,90%Line)進行比較發現:性能dbcp<=c3p0<proxool;
2> 不同情況下的同一數據庫連接池測試:通過觀察 Average,median,90%Line三個參數發
現三個連接池的穩定性(三種連接池的三個測試參數的變化情況)依次:穩定性dbcp>=c3p0>proxool。
結論:
通過對三種數據庫連接池的性能測試發現,proxool和 c3p0可以更好的支持高並發。可是在穩定性方面略遜於 dpcp。
各種連接池的配置:
未配置連接池的情況:
- <?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>
配置DBCP
- <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>
- <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
- <!--
- <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"/>
測試使用一下
- <import resource="classpath:bean-dbcp.xml" />
- <bean id="helloJdbcDao" class="cn.partner4java.jdbc.impl.HelloJdbcDaoBean">
- <property name="dataSource" ref="dataSource"/>
- </bean>
。
。。。。
。
- package cn.partner4java.jdbc;
- import java.sql.Connection;
- import java.sql.SQLException;
- /**
- * 存jdbc練習
- * @author wangchanglong
- *
- */
- public interface HelloJdbcDao {
- public Connection getConnection() throws SQLException;
- }
。
。。。
。。
- 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();
- }
- }
。。
。。。
- 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());
- }
- }
