一. 為什麼使用threadlocal:
如果涉及到呼叫多個service, 那我是不是還得從controller層傳遞connection?
從而不會影響其他執行緒中的例項變數,所以threadlocal可以實現執行緒範圍內資料共享。
二. 如何使用threadlocal:
1. 寫乙個transactionmanager類:
/**
* 管理事務
*/public class transactionmanager
// 回滾事務
public static void rollback() throws sqlexception
} // 提交事務
public static void commit() throws sqlexception }
// 關閉連線
public static void close() throws sqlexception
} // 獲取資料庫連線
public static connection getconnection()
}
使用threadlocal, 確保相同的執行緒獲取到的是同乙個連線.
2.修改業務處理類
/**
* 業務邏輯層
*/public class accountservice catch (exception e) finally
}}
使用transactionmanager來管理事務, **變得更加簡潔.
3. 修改dao類
/**
* dao層: crud
*/public class accountdao ;
queryrunner queryrunner = new queryrunner(jdbcutils.getdatasource());
return queryrunner.query(sql, new beanhandler(account.class), params); }
// 更新賬戶
public void update(account account) throws sqlexception ;
// 從threadlocal中獲取連線, 同乙個執行緒拿到的是同乙個連線
connection conn = transactionmanager.getconnection();
queryrunner queryrunner = new queryrunner();
queryrunner.update(conn, sql, params);
}}
不需要傳遞connection, 直接從transactionmanager中獲取連線.
三. 總結:
service和dao都是通過transactionmanager來獲取connection, 同乙個執行緒中, 它們在整個事務處理過程中使用了相同的connection物件, 所以事務會處理成功, dao中沒有接受和業務無關的物件, 消除了api汙染, 另外使用transactionmanager來管理事務, 使service層的**變簡潔了.
java事務使用
在web.xml中開啟對事物註解的解析 在方法上加上事務註解,propagation屬性在說明在 這裡,rollbackfor指定方法丟擲什麼異常後自動回滾。transactional propagation propagation.required,rollbackfor runtimeexcep...
Thread(執行緒)三
今天我們繼續接著執行緒講講,上一章提到一下task概念,首先接著task繼續往下講,在前章節提到過thread怎麼實現其他執行緒完成後再讓主線程繼續執行的功能,那麼如果task也需要執行緒等待事件,該怎麼實現呢?在這裡介紹四種方法。1 continuewhenany方法 taskfactory.co...
Java多執行緒 Thread
今天工作上用到了一些執行緒方面的知識,有些知識點學了不用一段時間後就會被忘記的,所以下來後覺得還是應該總結一下基礎知識,方面以後回顧。多執行緒程式在較低的層次上擴充套件了多工的概念 乙個程式同時執行多個任務。通常,每乙個任務稱為乙個執行緒,它是執行緒控制的簡稱。可以同時執行乙個以上執行緒的程式稱為多...