15

EclipseLink を JPA 2.0 プロバイダーとして使用すると、呼び出すだけで JDBC 接続を取得できます。

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

しかし、私は自分が何を担当しているのかわかりません。クエリを送信した後、接続を閉じる必要がありますか? または、EclipseLinkもこの接続を内部で使用しているため、接続を閉じることはできません。それとも、EclipseLink が私の動作を監視し、接続を行わなければ自動的に接続を閉じるため、気にしませんか?

4

2 に答える 2

10

JPA トランザクションのコンテキストにいる場合、接続はプロバイダー (EclipseLink) によって管理されます。トランザクションの外にいる場合は、自分で接続を管理する責任があります。

詳細については、次のリンクを参照してください。

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

于 2012-07-30T14:55:02.367 に答える
1

しかし、私は自分が何を担当しているのかわかりません。クエリを送信した後、接続を閉じる必要がありますか? または、EclipseLinkもこの接続を内部で使用しているため、接続を閉じることはできません。

適切で有効な質問です。unwrap()ドキュメントには呼び出しのセマンティクスが欠けているようです。

EclipseLink に関して、私がソースから得たものによると:

EclipseLink は、現在アクティブなクライアント セッション トランザクションに使用する、現在アクティブな への参照を提供します。アクティブなトランザクションがない場合、新しい が作成され、セッションに関連付けられ、メソッドから返されます。connectionunwrap()

結果として、IMHO、そのような取得のコミット/ロールバックは、Connection未定義の動作や例外につながる可能性があります。変更されたレコードが eclipselink 内部キャッシュによって以前にキャッシュされた DML の実行、または管理対象エンティティーが存在する DML の実行についても同様です。
したがって、この API を使用する場合、特に基になるトランザクションがダーティである場合は注意してください。

内部の eclipselink クラスを参照できる場合は、eclipselink の内部接続プールにアクセスしてConnection排他的に取得できます ( を参照してくださいorg.eclipse.persistence.sessions.server.ServerSession.getConnectionPool(String))。

于 2014-10-13T15:04:22.540 に答える