package com.atguigu.api.utils;
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.SQLException;
import java.util.Properties;
/**
* v1.0版本工具类:
* 内部包含一个连接池对象,并且对外部提供获取连接和回收连接的方法!
*
* 工具类的方法建议写成静态的,外部调用会更加方便!
*
* 属性:连接池对象(实例化一次)
* 单例模式或静态代码快static{全局调用一次}
*
* 方法:
* 对外提供链接的方法
* 回收外部传入连接方法
*
* V2.0版本,解决在同一个线程使用不同方法调用getConnection会得到多个connection对象,节约空间和时间
* 改进后在同一个线程中调用本方法只会得到同一个connection对象
*
*/
public class Jdbc_Druid_Utils_V2 {
private static DataSource dataSource = null;//创建连接池对象
private static ThreadLocal<Connection> tl = new ThreadLocal<>();//创建一个线程共享资源池,同一个线程需要用到的资源放到这里面。
static{
//初始化连接池对象
Properties properties = new Properties();
InputStream ips = Jdbc_Druid_Utils_V2.class.getClassLoader().getResourceAsStream("druid.properties");//创建一个input对象去读取配置文件
//如果配置文件在src的子文件夹中,则需要把子文件夹也写上。
try {
properties.load(ips);//properties去读取ips文件里的信息
} catch (IOException e) {
throw new RuntimeException(e);
}
try {
dataSource = DruidDataSourceFactory.createDataSource(properties);//通过properties里读取到的信息进行连接数据库,并将连接结果返回DataSource
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 对外提供链接的方法
*/
public static Connection getConnection() throws SQLException {
//return dataSource.getConnection();//外部调用这个getConnection方法就会得到Connection结果,通过这个结果就可以获取连接
//检查线程本地变量中是否存在
Connection connection = tl.get();
//如果第一次没有
if (connection==null){
//线程本地变量没有,连接池获取
connection = dataSource.getConnection();
//将从连接池获取的这个变量存进tl这个线程本地资源池中
tl.set(connection);
}
return connection;
}
/**
* 回收连接池方法
*/
public static void freeConnection () throws SQLException {
Connection connection = tl.get();
if (connection != null) {
tl.remove();//清空线程本地变量
connection.setAutoCommit(true);//事务状态回归,在其他地方开启事物的话是false,在结束的时候要把状态回归
connection.close();//回收到连接池即可
}
//如果connection为空的话表示不存在,就不需要释放回收了
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!