1 连接池(缓冲池)
连接池:可以称为物理数据源,代替了driverManager,通过德鲁伊获取固定的、可重用的、具有一定对象的池子。
连接池提供一些配置参数。
好处:
1)连接池的归还机制提高资源的利用率。
2)重复利用
3)避免资源浪费。
数据库连接池---c3p0/dbcp/druid等,只是提供这个缓冲池,必须要提供与之相对应的jar包。
2 Apache的Dbutils的代码演示
代码演示:
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
// 1 导包
// druid-1.1.10.jar
// mysql-connector-java-8.0.23.jar
// commons-dbutils-1.7.jar
// 配置文件 :druidJdbc.properties
// driverClassName=com.mysql.cj.jdbc.Driver
// url=jdbc:mysql://localhost:3306/employee?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
// username=root 和原始的Jdbc的不同user-->username
// password=123456
// initialSize=5 连接池初始化时初始化的数据库连接数
// maxActive=10 连接池的最大连接数据库数,如果设为0则认为不限制数量
// maxWait=3000 当前连接数量超过了最大连接数量,等待三秒钟后,则产生异常。
//
public class DruidJdbcUtils {
//线程 存储Connection:模拟线程
private static ThreadLocalt1 = new ThreadLocal<>() ;
private static DataSource ds ;//将DataSource定义为成员变量,方便获取数据源。
static {//加载druid配置文件
try {
Properties prop = new Properties() ;
InputStream inputStream = DruidJdbcUtils.class.getClassLoader().getResourceAsStream("druid.properties");
//加载属性列表
prop.load(inputStream);
//创建数据源对象
ds = DruidDataSourceFactory.createDataSource(prop) ;
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
//定义静态方法,获取数据源
public static DataSource getDataSource(){
return ds ;
}
public static Connection getConnection(){
Connection cont = null ;
try {
cont = t1.get();
if (cont == null){
cont = ds.getConnection() ;//从线程池中获取连接对象
t1.set(cont);//绑定当前线程上。
}
return cont ;
} catch (SQLException e) {
e.printStackTrace();
}
return null ;
}
//释放资源 ResultSet、PreparedStatement、Connection
public static void close(ResultSet rs, PreparedStatement 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();
}
}
}
// 将释放资源也可以封装到功能中
//针对的是DDL/DML语句操作时释放资源
public static void close(PreparedStatement stmt, Connection conn){
close(null,stmt,conn);
}
//之后用到事物,封装事物的代码和开启代码
public static void startStransaction()throws SQLException{
Connection connection = ds.getConnection() ;
connection.setAutoCommit(false);
connection.close();
t1.remove();
}
//事物回滚
public static void rollBackAndClose()throws SQLException{
Connection connection = ds.getConnection();
connection.rollback();
connection.close();
t1.remove();
}
//提交事务
public static void commitAndClose()throws SQLException{
Connection connection = ds.getConnection();
connection.commit();
connection.close();
t1.remove();
}
}