一个数据库连接对象对应着一个物理数据库连接,使用完后关闭连接。频繁的打开关闭连接会造成系统的性能低下,且可能造成数据库的缓存溢出,通常开发中使用连接池(严格来说叫做数据源:DataSource)来进行处理。
连接池的解决方案是:当应用程序启动时,系统主动建立足够的数据库连接,并将它们组成连接池,每次应用请求数据库连接时,无需创建连接,而是从连接池中取出一个已有的连接,使用完后,也不用关闭连接,而是归还给连接池。
连接池的使用很容易理解:原本直接从数据库获得连接,现在改为从连接池获得连接。使用之前,先把连接池对象连接到数据库,然后从连接池对象获得连接即可。
C3P0连接池的用法步骤简述为(首先导入c3p0-x.x.x.x.jar):
1:创建连接池实例:CombopooledDataSource ds = new CombopooledDataSource();
2:设置连接池连接数据库需要的驱动:ds.setDriverClass("com.mysql.jdbc.Driver");
3:连接池连接到数据库:
设置数据库url:ds.setJdbcUrl("jdbc:mysql://localhost/xxxx");
设置用户名:ds.setUser("root");
设置密码:ds.setPassword("123456");
设置连接池最大连接数:ds.setMaxPoolSize(x);
设置连接池最小连接数:ds.setMinPoolSieze(x);
设置连接池初始连接数:ds.setInitialPoolSize(x);
设置连接池缓存Statement的最大数:ds.setMaxStatements(x);
4:连接池创建完成后,当使用时,使用ds.getConnection()即可获得连接对象。其余操作和之前类似。
代码如下。其中,JDBCUtils[2]为抽取出的工具类,这里不再展示。
package com.imooc.jdbc.demo3;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import org.junit.Test;
import com.imooc.jdbc.utils.JDBCUtils;
import com.imooc.jdbc.utils.JDBCUtils2;
import com.mchange.v2.c3p0.ComboPooledDataSource;
/**
* 连接池的测试类
* @author jt
*
*/
public class DataSourceDemo1 {
@Test
/**
* 使用配置文件的方式
*/
public void demo2(){
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try{
/*// 获得连接:
ComboPooledDataSource dataSource = new ComboPooledDataSource();*/
// 获得连接:
// conn = dataSource.getConnection();
conn = JDBCUtils2.getConnection();
// 编写Sql:
String sql = "select * from user";
// 预编译SQL:
pstmt = conn.prepareStatement(sql);
// 设置参数
// 执行SQL:
rs = pstmt.executeQuery();
while(rs.next()){
System.out.println(rs.getInt("uid")+" "+rs.getString("username")+" "+rs.getString("password")+" "+rs.getString("name"));
}
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCUtils2.release(rs, pstmt, conn);
}
}
@Test
/**
* 手动设置连接池
*/
public void demo1(){
// 获得连接:
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try{
// 创建连接池:
ComboPooledDataSource dataSource = new ComboPooledDataSource();
// 设置连接池的参数:
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql:///jdbctest");
dataSource.setUser("root");
dataSource.setPassword("abc");
//设置最大连接数
dataSource.setMaxPoolSize(20);
//初始连接数
dataSource.setInitialPoolSize(3);
// 获得连接:
conn = dataSource.getConnection();
// 编写Sql:
String sql = "select * from user";
// 预编译SQL:
pstmt = conn.prepareStatement(sql);
// 设置参数
// 执行SQL:
rs = pstmt.executeQuery();
while(rs.next()){
System.out.println(rs.getInt("uid")+" "+rs.getString("username")+" "+rs.getString("password")+" "+rs.getString("name"));
}
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCUtils.release(rs, pstmt, conn);
}
}
}
c3p0-config.xml:
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql:///jdbctest</property>
<property name="user">root</property>
<property name="password">abc</property>
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">20</property>
</default-config>
</c3p0-config>
连接池常使用配置文件配置进行配置。具体内容详细看代码