使用的EclipseLink作爲JPA 2.0提供的JDBC連接,我可以通過簡單地調用充分利用的EclipseLink
Connection con = entityManager.unwrap(Connection.class);
獲得JDBC連接,但我不能確定什麼,我負責。提交查詢後是否必須關閉連接?或者我不允許關閉連接,因爲EclipseLink也在內部使用此連接。或者它不在乎,因爲EclipseLink會觀察我的行爲並自動關閉連接(如果我不這樣做)?
使用的EclipseLink作爲JPA 2.0提供的JDBC連接,我可以通過簡單地調用充分利用的EclipseLink
Connection con = entityManager.unwrap(Connection.class);
獲得JDBC連接,但我不能確定什麼,我負責。提交查詢後是否必須關閉連接?或者我不允許關閉連接,因爲EclipseLink也在內部使用此連接。或者它不在乎,因爲EclipseLink會觀察我的行爲並自動關閉連接(如果我不這樣做)?
如果您處於JPA事務的上下文中,連接將由提供者(EclipseLink)管理。如果您不在交易中,則需要自行負責管理連接。
請參閱以下鏈接瞭解更多信息:
但我不能確定什麼,我負責。提交我的查詢後,是否必須關閉 連接?或者我不允許 關閉連接,因爲EclipseLink在內部也使用此連接 。
一個很好的和有效的問題。看起來文檔缺少unwrap()
調用的語義。
有關EclipseLink,從我從source有根據:
的EclipseLink爲您提供了一個參照到當前活動connection
它使用了目前活動的客戶端會話事務。如果沒有交易處於活動狀態,將會創建一個新的,與會話關聯並從unwrap()
方法返回。
因此,恕我直言,這樣一個獲得Connection
提交/回滾可能導致未定義的行爲和/或例外。執行DML的情況也是如此,其中更改的記錄以前由eclipselink內部緩存緩存或存在哪些管理實體。
所以,當使用這個API,特別是如果底層交易是骯髒的,要小心。
如果您可以參考內部eclipselink類,則可以訪問eclipselink內部連接池以獨家獲取Connection
(查看org.eclipse.persistence.sessions.server.ServerSession.getConnectionPool(String)
)。
這是Java EE還是SE? – perissf 2012-07-29 16:07:15
普通Java SE環境。 – user1494080 2012-07-29 22:11:57
爲什麼你需要連接? JPA在大多數情況下使用EntityManager。 – perissf 2012-07-30 05:25:32