1. 程式人生 > >ThreadLocal解決事務執行緒安全問題(c3p0資料庫連線池工具類)

ThreadLocal解決事務執行緒安全問題(c3p0資料庫連線池工具類)

ThreadLocal底層是Map集合,它的key是當前執行緒,value由自己設定,可以繫結Connection或其他物件等,保證本次同一執行緒使用同一Connection。

ThreadLocal類提供幾個方法: get/set/remove


以下是ThreadLocal搭配c3p0連線資料庫,保證執行緒安全工具類:

package com.shop.Utils;

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

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class DataSourceUtils {
	private static DataSource dataSource = new ComboPooledDataSource();
	private static ThreadLocal<Connection> tl = new ThreadLocal<>();
	
	//將Connection繫結到當前執行緒
	public static Connection getConnection() throws SQLException{
		Connection conn = tl.get();
		if(conn==null){
				conn = dataSource.getConnection();
			tl.set(conn);
		}
		return conn;
	}
	
	public static DataSource getDataSource(){
		return dataSource;
	}
	//開啟事務
	public static void startTransaction() throws SQLException{
		Connection conn = getConnection();
		if(conn!=null)
			conn.setAutoCommit(false); //開啟事務
	}
	//回滾事務
	public static void rollback() throws SQLException{
		Connection conn = getConnection();
		if(conn!=null)
			conn.rollback();
	}
	//提交事務並釋放資源
	public static void commitAndRelease() throws SQLException{
		Connection conn = getConnection();
		if(conn!=null){
			conn.commit();
			conn.close();
			tl.remove();
		}
	}
	//關閉資源方法:conn, rs, stat
}