DBCP
DBCP 是 阿帕奇 软件基金组织的开源连接池实现,使用该连接池,需要导入两个 jar 文件
分类 | 属性 | 描述 |
---|---|---|
必须项 | driverClassName | 数据库驱动名称 |
url | 数据库的地址 | |
username | 用户名 | |
password | 密码 | |
基本项(扩展) | maxActive | 最大连接数量 |
minIdle | 最小空闲连接 | |
maxIdle | 最大空闲连接 | |
initialSize | 初始化连接 |
#key=value
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/db2?rewriteBatchedStatements=true
username=root
password =root
#初始连接数
initialSize=5
#最大连接属
maxActive=5
#超时时间
maxWait=3000
属性名字不能乱写,因为使用BasicDataSourceFactory.createDataSource(Properties properties)
创建DataSource对象时,需要传入 Properties ,该方法在源码中已经指定了属性文件的key
如果属性文件中的key与 源码中的key 不符,将无法读取到配置文件中对应的信息
使用BasicDataSourceFactory 创建连接池对象
/*
* DBCP工具类
*/
public class DBCPUtil {
private static DataSource dataSource;
private DBCPUtil(){}
static {
try {
Properties p = new Properties();
InputStream is = DBCPUtil.class.getClassLoader().getResourceAsStream("db.properties");
p.load(is);
//BasicDataSourceFactory 可以避免从Properties取数据,比较方便
dataSource = BasicDataSourceFactory.createDataSource(p);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取数据库连接对象
*
* @return
*/
public static Connection getConn() {
try {
//因为Connection线程不安全,每次都要返回一个新的
return dataSource.getConnection();
} catch (Exception e) {
e.printStackTrace();
}
throw new RuntimeException("数据库连接失败");
}
/**
* 释放资源
*
* @param con
* @param st
* @param rs
*/
public static void close(Connection con, Statement st, ResultSet rs) {
//5:释放资源
try {
if (rs != null) {
rs.close();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (st != null) {
st.close();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (con != null) {
con.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
测试DBCP工具类
public class DBCPTest {
@Test
public void test1() throws Exception {
String sql = "SELECT * FROM t_student";
//从连接池中获取连接对象
Connection conn = DBCPUtil.getConn();
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
String name = rs.getString("name");
int age = rs.getInt("age");
System.out.println(name + ":" + age);
}
}
}
Druid
Druid 和 DBCP 的连接属性完全相同,只是创建连接池的对象不同
Druid 使用 DruidDataScourceFactory
DBCP 使用 BasicDataSourceFactory
#key=value
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/db2?rewriteBatchedStatements=true
username=root
password =root
#初始连接数
initialSize=5
#最大连接属
maxActive=5
#超时时间
maxWait=3000
获取数据库连接池对象:通过工厂来获取:DruidDataScourceFactory
package com.itcast.util;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.springframework.core.io.support.PropertiesLoaderUtils;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
* Druid 连接池的工具类
*/
public class GruidUtils {
//数据源
private static DataSource ds;
private GruidUtils(){}
static {
try {
// Properties pro = PropertiesLoaderUtils.loadAllProperties("druid.properties");
Properties p = new Properties();
InputStream is = GruidUtils.class.getClassLoader().getResourceAsStream("druid.properties");
p.load(is);
ds = DruidDataSourceFactory.createDataSource(p);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取连接对象
*
* @return 连接对象
*/
public static Connection getConnection() {
try {
return ds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("数据库连接失败!");
}
}
/**
* 获取连接池
*
* @return
*/
public static DataSource getDataSource() {
return ds;
}
//释放资源
public static void close(Connection conn, Statement st, ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (st != null) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
测试GruidUtils工具类
public class DruidTest {
@Test
public void test2() throws SQLException {
/**
* 完成添加操作:给t_student 表添加一条记录
*/
String sql = "INSERT INTO t_student(name,age) VALUES(?,?)";
//获取连接对象
Connection conn = GruidUtils.getConnection();
//获取语句执行对象
PreparedStatement ps = conn.prepareStatement(sql);
//设置占位符参数
ps.setString(1, "乔峰");
ps.setInt(2, 30);
//执行SQL
ps.executeUpdate();
}
}
每个连接池的配置属性需要在项目中进行测试后,才能确定每个属性的值
各种连接池性能测试----阿里测试
Druid详细文档
C3P0
Hibernate 就推荐使用该连接池。C3P0 连接池 不仅可以自动清理使用的Connection ,还可以自动清理 Statement和Result,
C3P0 连接池需要导入 :
定义配置文件:
com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/day25
root
root
5
10
3000
com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/day25
root
root
5
8
1000
创建核心对象:ComboPooledDataSource
//创建数据库连接池对象,不为ComboPooledDataSource 传值使用默认配置 default-config
//可以传入指定配置名称 otherc3p0
DataSource ds = new ComboPooledDataSource();
工具类
public class C3P0Utils {
//数据源
private static DataSource ds;
static {
//会自动查找配置文件
ds = new ComboPooledDataSource();
}
/**
* 获取连接对象
*
* @return 连接对象
*/
public static Connection getConnection() {
try {
return ds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("数据库连接失败!");
}
}
}
测试工具类
@Test
public void test4() throws SQLException {
//获取数据库连接
Connection conn = C3P0Utils.getConnection();
PreparedStatement ps = conn.prepareStatement("SELECT * FROM t_student");
ResultSet rs = ps.executeQuery();
while (rs.next()) {
System.out.println(rs.getString(2));
}
}
C3P0 无需手动加载配置文件,ComboPooledDataSource 会自动查找,前提是配置文件名称与它要求的名称一致。