2012-07-29 115 views
11

使用的EclipseLink作爲JPA 2.0提供的JDBC連接,我可以通過簡單地調用充分利用的EclipseLink

Connection con = entityManager.unwrap(Connection.class); 

獲得JDBC連接,但我不能確定什麼,我負責。提交查詢後是否必須關閉連接?或者我不允許關閉連接,因爲EclipseLink也在內部使用此連接。或者它不在乎,因爲EclipseLink會觀察我的行爲並自動關閉連接(如果我不這樣做)?

+0

這是Java EE還是SE? – perissf 2012-07-29 16:07:15

+0

普通Java SE環境。 – user1494080 2012-07-29 22:11:57

+0

爲什麼你需要連接? JPA在大多數情況下使用EntityManager。 – perissf 2012-07-30 05:25:32

回答

6

如果您處於JPA事務的上下文中,連接將由提供者(EclipseLink)管理。如果您不在交易中,則需要自行負責管理連接。

請參閱以下鏈接瞭解更多信息:

http://wiki.eclipse.org/EclipseLink/Examples/JPA/EMAPI#Getting_a_JDBC_Connection_from_an_EntityManager

+0

我有一個問題。事務總是會提交更改,即使我將對實體管理器執行回滾。我正在使用Informix db和ifxjdbc驅動程序。交易是由應用管理的。 第二個問題是eclipselink在unwrap(java.sql.Connection)上返回null。將eclipselink 2.5.1與舊的SGES2.1.1結合使用。 – dmatej 2013-11-14 22:31:18

+0

解決方法:EclipseLink wiki錯了,但它的解包方法是正確的。我今天修復了Eclipselink的wiki。 – dmatej 2013-11-20 11:29:36

1

但我不能確定什麼,我負責。提交我的查詢後,是否必須關閉 連接?或者我不允許 關閉連接,因爲EclipseLink在內部也使用此連接 。

一個很好的和有效的問題。看起來文檔缺少unwrap()調用的語義。

有關EclipseLink,從我從source有根據:

的EclipseLink爲您提供了一個參照當前活動connection它使用了目前活動的客戶端會話事務。如果沒有交易處於活動狀態,將會創建一個新的,與會話關聯並從unwrap()方法返回。

因此,恕我直言,這樣一個獲得Connection提交/回滾可能導致未定義的行爲和/或例外。執行DML的情況也是如此,其中更改的記錄以前由eclipselink內部緩存緩存或存在哪些管理實體。
所以,當使用這個API,特別是如果底層交易是骯髒的,要小心

如果您可以參考內部eclipselink類,則可以訪問eclipselink內部連接池以獨家獲取Connection(查看org.eclipse.persistence.sessions.server.ServerSession.getConnectionPool(String))。