ThreadLocal解決事務執行緒安全問題(c3p0資料庫連線池工具類)
阿新 • • 發佈:2018-11-10
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 }