2009-09-27 59 views
3

是否可以將EJB 3與JDBC一起使用。我在某處讀過,這是允許的。EJB 3與JDBC

但是,我聽說EJB 3實現默認情況下使用JTA。這對JDBC意味着什麼?僅用於交易支持嗎?這意味着當使用JDBC代碼時,JTA被用於事務處理?這意味着即使是本地交易也是作爲全球交易實施的

這是否意味着在EJB 3中使用JDBC並不是一個好主意?很多人把我指向JPA,但它是一個ORM。我想使用SQL。

有什麼建議?

+0

你爲什麼要使用EJB3?您是否將它與您從Spring Framework獲得的結果進行了比較?你將使用哪個版本的J2EE? – 2009-09-27 04:37:15

+0

附帶的Websphere 7 春DAO的Java EE5實現 - 簡單的JDBC模板似乎也不錯。事實上,我們只使用一個數據源,即所有本地事務。給這個架構的人認爲Spring除了像Tomcat這樣的非應用服務器之外,其價值主張是零。 – Shaw 2009-09-27 04:44:10

回答

2

這意味着JTA使用JDBC代碼時用於事務

而且

含義,即使是本地事務都被作爲全局事務執行?

EJB容器可以使用資源管理器本地事務作爲不需要分佈式事務的企業bean的優化技術。

這是一個好主意,做以聲明或編程式的事務時,以下幾點:

  • 使用企業bean類的資源註解或使用EJB的部署resource-ref元素聲明資源描述符

喜歡的東西(setter方法或構件字段)

// mappedName points to a global mapping name 
@Resource(mappedName="java:/DefaultDS") 
private javax.sql.DataSource ds; 

而內部的業務邏輯方法

  • 如果您使用的是聲明式事務

    連接康恩= DS。的getConnection();

  • 如果您使用的程序性交易

聲明一個二傳手或成員字段的UserTransaction

@Resource 
private UserTransaction ut; 

而且

ut.beginTransaction(); 

Connection conn = ds.getConnection(); 

ut.commit(); 

小心以下

如果您使用的是有狀態會話bean,請在PrePassivate回調方法如下

  • 關閉在PrePassivate方法的所有JDBC連接和指定實例的字段存儲的連接爲null

的問候,

+1

很好的答案,謝謝。 當你說,「EJB容器可以讓資源管理器的本地事務的用途作爲優化技術用於其分佈式事務不需要企業Bean」這是否意味着這是由EJB容器3自動完成?這是JEE標準要求還是某些供應商提供的功能? 如果它是一個功能,那麼默認情況下它是可配置還是通常以這種方式完成? – Shaw 2009-09-27 11:07:35

+0

@Shaw嗨,雖然不是必需的,但JEE規範允許在不需要分佈式事務時使用它。檢查你的JEE實現是否在分佈式事務不需要時使用資源管理器本地事務。 – 2009-09-27 15:30:32

+0

這是否意味着這由EJB 3容器自動完成? EJB容器可以自動完成它,但是再次檢查它的文檔是一個好主意。 – 2009-09-27 15:33:55

1

如果您正在使用JPA2,您可以使用entityManager.unwrap(Connection.class)得到實際的連接,並與您的JDBC代碼中使用。

例如:

Connection connection = entityManager.unwrap(Connection.class); 
try (Statement stmt = connection.createStatement()) { 
    stmt.executeUpdate("INSERT INTO MyTable(name) VALUES ('my name') "); 
} 

這是否意味着它不是使用JDBC與EJB 3個好主意?許多人 指向JPA,但它是一個ORM。我想使用SQL。

有時它是必要的,對性能或兼容性問題。我通常使用這種技術來執行PL/PSQL與數組參數,複雜Posgis SQL等