Java事務 三 使用ThreadLocal

2021-06-25 14:39:48 字數 1676 閱讀 5362

一. 為什麼使用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

今天工作上用到了一些執行緒方面的知識,有些知識點學了不用一段時間後就會被忘記的,所以下來後覺得還是應該總結一下基礎知識,方面以後回顧。多執行緒程式在較低的層次上擴充套件了多工的概念 乙個程式同時執行多個任務。通常,每乙個任務稱為乙個執行緒,它是執行緒控制的簡稱。可以同時執行乙個以上執行緒的程式稱為多...