我想通過使用一個微框架來編寫我的下一個微型Java Web應用程序。例如。 Spark或Jooby。問題是它們都不支持JTA,所以我需要使用其中一個第三方庫。我搜索了開源JTA實現,發現了兩個:Atomikos和Bitronix。看起來後面的項目略有放棄,所以我決定和Atomikos一起去。不幸的是,文檔很少,所以我無法找到我的問題的答案。如何在Web應用程序中正確使用獨立的TransactionManager?
這是用例。假設我們有哪些方法應該在單個事務下執行的兩項DAO類:
class SomeService {
// both injected by Guice
private FooDao fooDao;
private BarDao barDao;
public void someMethod() {
// both methods should be executed in a single transaction
fooDao.insert(new Foo());
barDao.insert(new Bar());
}
}
我從來沒有用過javax.transaction
API直接/手動之前(你知道的聲明性事務與春季很簡單的),所以我有點困惑。 JTA提供兩個通用抽象(UserTransaction
和TransactionManager
),它們都有處理JDBC事務的方法。據我瞭解,TransactionManager通過使用ThreadLocal變量來操作UserTransaction對象。因此UserTransaction應該是線程限制的,並且TransactionManager應該是線程安全的。我對麼?
所以有幾種方法可以:
- 我可以注入到事務管理我的服務(通過吉斯),並直接使用它。
- 我可以通過公共靜態變量共享TransactionManager。
- 我可以創建UserTransaction提供者/工廠(通過Guice)並從中獲取對象。
這是正確的/最佳實踐?
另一個問題,如果有人熟悉Atomikos是它提供了兩個事務管理器實現(可能更多):J2eeTransactionManager和UserTransactionManager。同樣的文檔太稀缺了,所以除了JNDI之外我沒有看到任何區別。我想UserTransactionManager應該夠我的目的,但描述的狀態下
J2eeTransactionManager
事務管理的實現,應該由J2EE 應用程序使用。
..沒有任何解釋。
ps。對不起,我的英語不好,我知道。
您打算使用哪種交易資源?簡單的SQL數據庫JMS-隊列/主題? JPA是參與的,ORM是hibernate還是eclipselink?你打算使用分佈式事務嗎?你是否希望能夠使用事務屬性註釋類或方法,或者「bean管理」事務是否足夠? – aschoerk
@aschoerk我只需要在單個事務中從不同的DAO類中執行兩個方法。我使用簡單的普通JDBC - 不包括JMS,JPA,XA事務或任何其他涉及JEE的東西。但是,我確實使用DI。現在我只想了解如何正確共享TM或UserTransaction實例。聲明式事務管理不是必需的。我想,只要我明白如何利用TM,它就足夠簡單,可以通過反射代理編寫定製的聲明式事務。 – Evan
爲什麼不共享JDBC連接?我認爲這對你應該是足夠的。只要簡單的「BEGIN TRANSACTION」和「COMMIT TRANSACTION」可以用於你的dao-calls,如果它們使用相同的連接。就是這樣,你的TM在這種情況下會爲你做。 – aschoerk