1. C3P0数据库连接池技术 2.Druid:数据库连接池实现技术 3.Druid连接池工具类
1. C3P0数据库连接池技术
实现:
1. 标准接口:DataSource javax.sql包下的
1. 方法: * 获取连接:getConnection() * 归还连接:Connection.close()。 这里的close 不再是关闭连接而是 归还连接
2. 一般我们不去实现它,有数据库厂商来实现
1. C3P0:数据库连接池技术 2. Druid:数据库连接池实现技术,由阿里巴巴提供的
步骤: 1. 导入jar包 (两个) c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar , 前者依赖后者
2. 定义配置文件:
* 名称: c3p0.properties 或者 c3p0-config.xml 固定的不然找不到 路径:直接将文件放在src目录下即可。
DataSource ds = new ComboPooledDataSource(); 1.创建数据库连接池对象,使用默认配置
Connection conn = ds.getConnection(); 如果连接最大获取数量为5这就可以 get5个连接对象如果获取第6个 超过最大超时后报错
DataSource ds = new ComboPooledDataSource("otherc3p0"); 如果传参 可以使用另一个配置
<c3p0-config>
<!-- 使用默认的配置读取连接池对象 -->
<default-config>
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/test?useSSL=false</property>
<property name="user">root</property>
<property name="password">123</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.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/db3</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>
2.Druid:数据库连接池实现技术
1. 步骤:1. 导入jar包 druid-1.0.9.jar
2. 定义配置文件: 是properties形式的 可以叫任意名称,可以放在任意目录下 需要手动加载Properties的配置文件
4. 获取数据库连接池对象:通过工厂来来获取 DruidDataSourceFactory
5. 获取连接:getConnection
Properties pro = new Properties();
InputStream is = druidDemo1.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
DataSource ds = DruidDataSourceFactory.createDataSource(pro); 获取连接池对象
Connection conn = ds.getConnection(); 获取连接
3.Druid连接池工具类
1.可以简单的获取一个连接对象 或者获取一个连接池,和释放资源的两中情况 1. 无结果集 2.有结果集多一个参数
package utils;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class JDBCUtils {
private static DataSource ds ; 定义这个池子变量
static{ 静态代码块 初始化资源
try {
Properties pro = new Properties(); 加载配置文件
pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
//2.获取DataSource
ds = DruidDataSourceFactory.createDataSource(pro);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}}
public static Connection getConnection() throws SQLException { 从池中返回一个连接对象
return ds.getConnection();
}
public static DataSource getDataSource(){ 获取连接池方法
return ds;
}}
public static void close(Statement stmt,Connection conn){ 释放资源 的两种情况
close(null,stmt,conn);
}
public static void close(ResultSet rs , Statement stmt, Connection conn){
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();}}
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();}}
if(conn != null){
try {
conn.close(); 归还连接
} catch (SQLException e) {
e.printStackTrace();
}}}
使用工具类
public class DruidDemo2 {
public static void main(String[] args) { 完成添加操作:给account表添加一条记录
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = JDBCUtils.getConnection(); 从池子中获取连接
String sql = "insert into account values(null,?,?)"; 定义sql
pstmt = conn.prepareStatement(sql); 获取pstmt对象
pstmt.setString(1,"王五"); 给?赋值
pstmt.setDouble(2,3000);
int count = pstmt.executeUpdate(); 执行sql
System.out.println(count);
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtils.close(pstmt,conn);}}} 释放资源