package cn.lnu.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; //�����࣬ʹ��dbcp����ʹ��dbutils���ʱ��Ҫ���ݿ����ӳأ�����Ҳ������дrelesse�����ˣ���Ϊdbutils��Դ��ܻ��Զ�Ϊ�����ͷ����� public class JdbcUtils { private static DataSource ds=null; private static ThreadLocal<Connection> tl=new ThreadLocal<Connection>();//ThreadLocal�ڲ�ά������һ��map���ϣ��Ե�ǰ�߳�threadΪkey,set�����󶨵�ֵΪvalue static{ try{ Properties dbcpconfig=new Properties(); InputStream in=JdbcUtils.class.getClassLoader().getResourceAsStream("dbcpconfig.properties"); dbcpconfig.load(in); BasicDataSourceFactory factory=new BasicDataSourceFactory(); ds=factory.createDataSource(dbcpconfig); }catch(Exception e){ throw new ExceptionInInitializerError(e); } } public static DataSource getDataSource(){ 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); } } //ʹ��ThreadLocal�������� 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); } } //ʹ��TreadLocal�ύ���� 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�������Ƴ���Ӧ��ǰ�̵߳�����)�����remove���Ե�ǰ�߳�Ϊkey,�Ƴ����󶨵�����߳��ϵ����� } } }