ThreadLocal 在連線池的應用
阿新 • • 發佈:2019-02-14
public class ManagerThreadLocal {
private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
//得到一個連線
public static Connection getConnection(){
Connection conn = tl.get();//從當前執行緒中取出一個連線
if(conn==null){
conn = C3P0Util.getConnection();//從池中取出一個
tl.set(conn);//把conn物件放入到當前執行緒物件中
}
return conn;
}
//開始事務
public static void startTransacation(){
try {
Connection conn = getConnection();
conn.setAutoCommit(false);//從當前執行緒物件中取出的連線,並開始事務
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void commit(){
try {
getConnection().commit();//提交事務
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void rollback(){
try {
getConnection().rollback();//回滾事務
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(){
try {
getConnection().close();//把連線放回池中
tl.remove();//把當前執行緒物件中的conn移除
} catch (SQLException e) {
e.printStackTrace();
}
}
private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
//得到一個連線
public static Connection getConnection(){
Connection conn = tl.get();//從當前執行緒中取出一個連線
if(conn==null){
conn = C3P0Util.getConnection();//從池中取出一個
tl.set(conn);//把conn物件放入到當前執行緒物件中
}
return conn;
}
//開始事務
public static void startTransacation(){
try {
Connection conn = getConnection();
conn.setAutoCommit(false);//從當前執行緒物件中取出的連線,並開始事務
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void commit(){
try {
getConnection().commit();//提交事務
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void rollback(){
try {
getConnection().rollback();//回滾事務
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(){
try {
getConnection().close();//把連線放回池中
tl.remove();//把當前執行緒物件中的conn移除
} catch (SQLException e) {
e.printStackTrace();
}
}
}
ThreadLocal為解決多執行緒程式的併發問題提供了一種新的思路。使用這個工具類可以很簡潔地編寫出優美的多執行緒程式。當使用ThreadLocal維護變數時,ThreadLocal為每個使用該變數的執行緒提供獨立的變數副本,所以每一個執行緒都可以獨立地改變自己的副本,而不會影響其它執行緒所對應的副本。
ThreadLocal類介面很簡單,只有4個方法,我們先來了解一下:
- void set(Object value)設定當前執行緒的執行緒區域性變數的值。
- public Object get()該方法返回當前執行緒所對應的執行緒區域性變數。
- public void remove()將當前執行緒區域性變數的值刪除,目的是為了減少記憶體的佔用,該方法是JDK 5.0新增的方法。需要指出的是,當執行緒結束後,對應該執行緒的區域性變數將自動被垃圾回收,所以顯式呼叫該方法清除執行緒的區域性變數並不是必須的操作,但它可以加快記憶體回收的速度。
- protected Object initialValue()返回該執行緒區域性變數的初始值,該方法是一個protected的方法,顯然是為了讓子類覆蓋而設計的。這個方法是一個延遲呼叫方法,線上程第1次呼叫get()或set(Object)時才執行,並且僅執行1次。ThreadLocal中的預設實現直接返回一個null。