ThreadLocal 与Connection
import lombok.extern.slf4j.Slf4j;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
/**
* @Title: ConnectionManager
* @ProjectName demo
* @Description: TODO
* @Author wangben
* @Date 2019/7/1- 11:48
*/
@Slf4j
public class ConnectionManager {
//创建一个私有静态的并且是与事务相关联的局部线程变量
private static ThreadLocal<Connection> connectionHolder = new ThreadLocal<Connection>();
/**
* 获得数据库连接并加入到线程变量中
* @param dataSource
* @return
*/
public static Connection getConnection(DataSource dataSource){
//获得线程变量connectionHolder的值conn
Connection conn = connectionHolder.get();
if (conn == null){
//如果连接为空,则创建连接,另一个工具类,创建连接
try {
conn = dataSource.getConnection();
}catch (SQLException e){
log.error("ConnectionManager getConnection error");
}
//将局部变量connectionHolder的值设置为conn
connectionHolder.set(conn);
}
return conn;
}
/**
* 关闭连接和从线程变量中删除conn
*/
public static void closeConnection(){
//获得线程变量connectionHolder的值conn
Connection conn = connectionHolder.get();
if (conn != null){
try {
//关闭连接
conn.close();
//从线程局部变量中移除conn,如果没有移除掉,下次还会用这个已经关闭的连接,就会出错
connectionHolder.remove();
}catch(SQLException e){
log.error("ConnectionManager closeConnection error",e);
}
}
}
/**
*开启事务,手动开启
*/
public static void beginTransaction(Connection conn){
try {
//如果连接存在,再设置连接,否则会出错
if (conn != null){
//默认conn是自动提交,
if (conn.getAutoCommit()){
//关闭自动提交,即是手动开启事务
conn.setAutoCommit(false);
}
}
}catch(SQLException e){
log.error("beginTransaction error",e);
}
}
/**
* 提交事务
*/
public static void commitTransaction(Connection conn){
try{
if (conn != null){
if (!conn.getAutoCommit()){
conn.commit();
}
}
}catch(SQLException e){
log.error("commitTransaction" ,e);
}
}
/**
* 回滚事务
*/
public static void rollbackTransaction(Connection conn){
try {
if (conn != null){
if(!conn.getAutoCommit()){
conn.rollback();
}
}
}catch(SQLException e){
e.printStackTrace();
}
}
//调用业务逻辑事务管理
public void addFlowCard(FlowCard flowCard)
Connection conn = null;
try {
//从ThreadLocal中取得Connection
conn = ConnectionManager.getConnection();
//手动控制事务提交
ConnectionManager.beginTransaction(conn);
//添加流向单主信息
flowCardDao.addFlowCardMaster(flowCardVouNo, flowCard);
//添加流向单明细信息
flowCardDao.addFlowCardDetail(flowCardVouNo, flowCard.getFlowCardDetailList());
if (!conn.getAutoCommit()) {
//提交事务
ConnectionManager.commitTransaction(conn);
}
}catch(Exception e) {
e.printStackTrace();
if (!conn.getAutoCommit()) {
//回滚事务
ConnectionManager.rollbackTransaction(conn);
}
throw new ApplicationException("操作失败!");
}finally {
ConnectionManager.closeConnection();
}
}
}
end