DBCP
DBCP 是 阿帕奇 软件基金组织的开源连接池实现,使用该连接池,需要导入两个 jar 文件
- commons-dbcp.jar:连接池的实现
- commons-pool.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
准备环境:
- druid-1.0.15.jar
配置文件
#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();
}
}
每个连接池的配置属性需要在项目中进行测试后,才能确定每个属性的值
C3P0
Hibernate 就推荐使用该连接池。C3P0 连接池 不仅可以自动清理使用的Connection ,还可以自动清理 Statement和Result,
C3P0 连接池需要导入 :
- c3p0-0.9.1.2.jar
- mchange-commons-java-0.2.12.jar
定义配置文件:
- 名称:c3p0.properties 或者 c3p0-config.xml 必须是这两个名称,因为C3P0会自动去查找配置文件
- 路径:直接将文件放在src目录下即可
<c3p0-config>
<!-- 使用默认的配置读取连接池对象 -->
<default-config>
<!-- 连接参数 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/day25</property>
<property name="user">root</property>
<property name="password">root</property>
<!-- 连接池参数 -->
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">10</property>
<property name="checkoutTimeout">3000</property>
</default-config>
<named-config name="otherc3p0">
<!-- 连接参数 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/day25</property>
<property name="user">root</property>
<property name="password">root</property>
<!-- 连接池参数 -->
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">8</property>
<property name="checkoutTimeout">1000</property>
</named-config>
</c3p0-config>
创建核心对象: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 会自动查找,前提是配置文件名称与它要求的名称一致。