JdbcUtils_DBCP事务控制(ThreadLocal)

来源:互联网 发布:加工中心编程招聘8000 编辑:程序博客网 时间:2024/05/18 13:28
package com.crazy4j.utils;import java.io.InputStream;import java.sql.Connection;import java.sql.SQLException;import java.util.Properties;import javax.sql.DataSource;import org.apache.commons.dbcp.BasicDataSourceFactory;public class JdbcUtils_DBCP {private static ThreadLocal<Connection> tl=new ThreadLocal<Connection>();private static DataSource ds = null;static{try{InputStream in = JdbcUtils_DBCP.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");Properties prop = new Properties();prop.load(in);BasicDataSourceFactory factory = new BasicDataSourceFactory();ds = factory.createDataSource(prop);}catch (Exception e) {throw new ExceptionInInitializerError(e);}}public static DataSource getDataSource() throws SQLException{return ds;}public static Connection getConnection() throws SQLException{try{//得到当前线程上绑定的连接Connection conn = tl.get();if(conn==null){  //代表线程上没有绑定连接conn = ds.getConnection();tl.set(conn);}return conn;}catch (Exception e) {throw new RuntimeException(e);}}public static void startTransaction(){try{//得到当前线程上绑定连接开启事务Connection conn = tl.get();if(conn==null){  //代表线程上没有绑定连接conn = ds.getConnection();tl.set(conn);}conn.setAutoCommit(false);}catch (Exception e) {throw new RuntimeException(e);}}public static void commitTransaction(){try{Connection conn = tl.get();if(conn!=null){conn.commit();}}catch (Exception e) {throw new RuntimeException(e);}}public static void closeConnection(){try{Connection conn = tl.get();if(conn!=null){conn.close();}}catch (Exception e) {throw new RuntimeException(e);}finally{tl.remove();   //千万注意,解除当前线程上绑定的链接(从threadlocal容器中移除对应当前线程的链接)}}}

原创粉丝点击