绑定线程代码实现
ThreadLocal的方法:
构造:
new ThreadLocal()
set(Object value):将内容和当前线程绑定
Object get():获取和迪昂前线程绑定的内容
remove():将当前线程和内容解绑
内部维护了map集合
map.put(当前线程,内容);
map.get(当前线程)
map.remove(当前线程)
代码
package com.feizhu.utils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class DataSourceUtils {
private static ComboPooledDataSource ds=new ComboPooledDataSource();
private static ThreadLocal<Connection> tl=new ThreadLocal<>();
/**
*获取数据源
* @return 连接
*/
public static DataSource getDataSource() {
return ds;
}
/**
* 从 当前线程上获取连接
* @return
* @throws SQLException
*/
public static Connection getConnection() throws SQLException {
Connection conn=tl.get();
if(conn==null) {
//第一次获取 创建一个连接和当前的线程绑定
conn=ds.getConnection();
//绑定
tl.set(conn);
}
return conn;
}
/**
* 释放连接
* @param conn 连接
*/
public static void closeConn(Connection conn) {
if(conn!=null) {
try {
conn.close();
//和当前的线程解绑
} catch (SQLException e) {
e.printStackTrace();
}
conn=null;
}
}
/**
*释放语句执行者
* @param st 执行者
*/
public static void closeStatement(PreparedStatement st) {
if(st!=null) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
st=null;
}
}
/**
*释放结果集
* @param rs 结果集
*/
public static void closeResultSet(ResultSet rs) {
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs=null;
}
}
/**
*
* @param conn
* @param st
* @param rs
*/
public static void closeRouse(Connection conn,PreparedStatement st,ResultSet rs) {
closeRouse(st,rs);
closeConn(conn);
}
public static void closeRouse(PreparedStatement st,ResultSet rs) {
closeResultSet(rs);
closeStatement(st);
}
/**
* 开启事物
* @throws SQLException
*/
public static void startTransaction() throws SQLException {
//获取连接//开启事物
getConnection().setAutoCommit(false);
}
//事物提交
public static void commitAndClose() {
//获取连接
try {
Connection conn=getConnection();
//提交事物
conn.commit();
//释放资源
conn.close();
//解除绑定
tl.remove();
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 事物回滚
* @throws SQLException
*/
//事物提交
public static void rollbackAndClose() {
//获取连接
try {
Connection conn=getConnection();
//事物回滚
conn.rollback();
//释放资源
conn.close();
//解除绑定
tl.remove();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
备注:由于个人原因,本博客暂停更新。如有问题可联系本人,本人提供技术指导、学习方向、学习路线。本人微信wlp1156107728(添加注明来意) QQ1156107728(添加注明来意)