在使用數據連接池之前,首先我們要知道使用連接池是什麼?連接池就是創建和管理一個連接的緩衝池技術,這些連接隨時會被需要他們的線程調用。那我們使用數據連接池有什麼好處呢?在我們連接數據庫的時候如果不使用數據連接池,每一次訪問數據庫都去創建一個連接,這樣會很消耗時間和項目的性能。
下面我們開始說一下Java中三種流行的數據庫連接池:
(1)C3P0連接池:C3P0官網(爲什麼把它放在第一位呢,我想大家對它應該是最熟悉的了,上學或者培訓的時候老師都講過。)
C3P0是一個開源數據連接池,Hibernate3.0默認自帶的數據連接池,性能比較穩定。
C3P0配置(以MySQL爲例):
st1:下載c3p0-0.9.1.2.jar
st2:在項目源路徑下創建XXX.properties
數據庫連接實例:
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///test
jdbc.user=root
jdbc.pwd=root
c3p0.minPoolSize=2
c3p0.maxPoolSize=10
st3:創建java類,獲取連接。
/**
*
*/
package com.test.dbUtil
import java.beans.PropertyVetoException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import com.mchange.v2.c3p0.ComboPooledDataSource;
/**
* @author DuZhuo
* 數據庫工具類
*/
public class DBUtil {
private static DBUtil dbutil;
private static Properties p;
static{
InputStream is=Thread.currentThread().getContextClassLoader().getResourceAsStream("xxx.properties");
p=new Properties();
try {
p.load(is);
} catch (IOException e) {
e.printStackTrace();
}
}
private DBUtil(){
}
public static DBUtil getDBUtil(){
if(dbutil==null){
dbutil=new DBUtil();
}
return dbutil;
}
/**
* 根據條件獲取連接池
* @param datasourcename
* @return
*/
public static ComboPooledDataSource getComboPooledDataSource(String datasourcename){
//創建一個連接池對象
ComboPooledDataSource cpds=new ComboPooledDataSource();
try {
cpds.setDriverClass(p.getProperty(datasourcename+".JDBCDriver"));
} catch (PropertyVetoException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
cpds.setJdbcUrl(p.getProperty(datasourcename+".url"));
cpds.setUser(p.getProperty(datasourcename+".UserId"));
cpds.setPassword(p.getProperty(datasourcename+".password"));
cpds.setInitialPoolSize(Integer.parseInt(p.getProperty(datasourcename+".initConns")));
cpds.setMaxPoolSize(Integer.parseInt(p.getProperty(datasourcename+".maxConns")));
return cpds;
}
}
在SSH中spring.xml中配置C3P0
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.user}"/>
<property name="password" value="${jdbc.pwd}"/>
<property name="minPoolSize" value="${c3p0.minPoolSize}"/>
<property name="maxPoolSize" value="${c3p0.maxPoolSize}"/>
</bean>
在SSH中hibernate.cfg.xml(該配置不使用properties文件)
<!-- 1. 配置數據庫方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<!-- 2. 數據庫連接參數 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/lianxi</property>
<property name="connection.username">root</property>
<property name="connection.password">201314</property>
<!-- 3. 配置c3p0連接池 -->
<property name="connection.provider_class">org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider</property>
<!-- 設置c3p0的優化參數 -->
<property name="c3p0.min_size">5</property>
<property name="c3p0.max_size">30</property>
<property name="c3p0.timeout">1800</property>
<property name="c3p0.max_statements">50</property>
(2)DBCP連接池:DBCP官網
DBCP是Apache下面專門爲java提供的數據連接池,也是Tomcat數據連接的組件。(注:由於bug太多,Hibernate已經不再支持。)
DBCP配置(以MySQL爲例):
st1:導入common-dbcp.jar、common-pool.jar、common-collections.jar
st2:在項目源路徑下創建XXX.properties
數據庫連接實例:
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///test
jdbc.user=root
jdbc.pwd=root
st3:java類中調用
public static DataSource getDataSource(){
//創建一個連接池對象
DataSource ds=null;
BasicDataSource bds=new BasicDataSource();
try {
ds.setDriverClass(p.getProperty("jdbc.driverClass"));
} catch (PropertyVetoException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
bds.setJdbcUrl(p.getProperty("jdbc.url"));
bds.setUser(p.getProperty("jdbc.user"));
bds.setPassword(p.getProperty("jdbc.pwd"));
ds=bds;
return ds;
}
SSH框架Spring中調用<bean id="dataSource" destroy-method="close"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.pwd}"/>
</bean>
(3)Proxool連接池:Proxool官網
Proxool是sourceforge下面的一個開源數據連接池,最大的特色便是Proxool提供了監視的功能,便於發現連接泄漏的情況。
Proxool配置(以Oracle爲例):
st1:導入proxool-0.9.0RC3.jar
str2:項目源目錄下創建proxool.xml
<?xml version="1.0" encoding="utf-8"?>
<something-else-entirely>
<proxool>
<alias>test</alias>
<driver-url>jdbc:oracle:thin:@127.0.0.1:1521:test</driver-url>
<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
<driver-properties>
<property name="user" value="test"/>
<property name="password" value="test"/>
</driver-properties>
<house-keeping-sleep-time>90000</house-keeping-sleep-time>
<prototype-count>10</prototype-count>
<maximum-connection-count>100</maximum-connection-count>
<minimum-connection-count>20</minimum-connection-count>
<maximum-active-time>900000</maximum-active-time>
</proxool>
</something-else-entirely>
st3:在web.xml中初始化proxool
<!--proxool-->
<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/classes/proxool.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>proxoolServletConfigurator</servlet-name>
<!-- 訪問http://localhost:8080/項目名稱/proxool即可看到頁面 -->
<url-pattern>/proxool</url-pattern>
</servlet-mapping>
st4:創建連接
Connection conn = null;
try {
Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
conn = DriverManager.getConnection("proxool.test"); //使用proxool連接池
}
在SSH中Hibernate的配置
<hibernate-configuration>
<session-factory>
<property name="hibernate.proxool.pool_alias">test</property>
<property name="hibernate.proxool.xml">proxool.xml</property>
<property name="hibernate.connection.provider_class">org.hibernate.connection.ProxoolConnectionProvider</property>
<property name="hibernate.proxool.existing_pool">true</property>
<property name="dialect">oracle.jdbc.driver.OracleDriver</property>
<property name="hibernate.cache.use_query_cache">true</property>
</session-factory>
</hibernate-configuration>
在SSH中Spring的配置
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>org.logicalcobwebs.proxool.ProxoolDriver</value>
</property>
<property name="url">
<value>proxool.test</value>
</property>
</bean>