JDBCToolsV2:利用ThreadLocal保证当前线程操作同一个数据库连接对象。

JDBCToolsV2:     利用ThreadLocal保证当前线程操作同一个数据库连接对象。

package com.dgd.test;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Properties;

public class JDBCToolsV2 {

    private  static DataSource ds;
    private  static ThreadLocal<Connection> th;
    //静态代码块,创建数据库连接池
    static {
        try {
            Properties p=new Properties();
            p.load(JDBCToolsV1.class.getClassLoader().getResourceAsStream("druid.properties"));
            ds= DruidDataSourceFactory.createDataSource(p);
            th=new ThreadLocal<>();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public  static Connection getConnection(){
        //方式1: DriverManger.getConnection();
        //方式2: 数据库连接池, ds.getConnection();
        try {
            Connection conn=th.get();   //获取当前线程的共享连接对象
            if(conn==null)              //当前线程没有拿过连接,第一个获取连接
            {
                conn=ds.getConnection();//从线程池中哪一个新的
                th.set(conn);           //放到当前线程共享变量中
            }
            return  conn;
        } catch (SQLException e) {
            e.printStackTrace();
            return  null;
        }
    }
    //关闭连接方法
    public  static  void free( Connection conn){
        try {
            Connection conn=th.get();   //获取当前线程的共享连接对象
            if(conn!=null)              //当前线程获取连接
            {
                conn.close();      //关闭当前数据库连接
            }
       th.set(null);           //将ThreadLocal设置为空,防止上次关闭,下次获取一个关闭的数据库连接
} catch (SQLException e) { e.printStackTrace(); } } public static int update3( String sql, Object... args) throws SQLException { Connection conn=getConnection(); PreparedStatement ps=conn.prepareStatement(sql); if(args!=null && args.length>0) { for (int i = 0; i <args.length ; i++) { ps.setObject(i+1,args[i]); } } int len=ps.executeUpdate(); ps.close(); return len; } }

Test:

package com.dgd.test;

import org.junit.Test;

import java.sql.Connection;
import java.sql.SQLException;

public class TestJDBCToolV1 {

    @Test
    public  void  test2() throws SQLException {
        String sql1="INSERT INTO COURSE VALUES(NULL,?)";
        String sql2="INSERT INTO COURSE VALUES(NULL,?)";
        Connection conn= JDBCToolsV2.getConnection();

        conn.setAutoCommit(false);
        try {
            int len1=JDBCToolsV2.update3(sql1,"美术");
            int len2=JDBCToolsV2.update3(sql2,"体育");
            if(len1>0 && len2>0)
            {
                conn.commit();
            }
            else
            {
                conn.rollback();
            }
        } catch (SQLException e) {
            conn.rollback();
        }
        conn.setAutoCommit(true);
        JDBCToolsV2.free(conn);

    }
}
原文地址:https://www.cnblogs.com/lemonzhang/p/12813031.html