在使用数据连接池之前,首先我们要知道使用连接池是什么?连接池就是创建和管理一个连接的缓冲池技术,这些连接随时会被需要他们的线程调用。那我们使用数据连接池有什么好处呢?在我们连接数据库的时候如果不使用数据连接池,每一次访问数据库都去创建一个连接,这样会很消耗时间和项目的性能。
下面我们开始说一下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>