2012-07-29 23 views
11

からJDBC接続を取得、私は単にはJPA 2.0プロバイダとしてのEclipseLinkを使用してEclipseLinkの

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

を呼び出すことにより、JDBC接続を取得することができますしかし、私は、私が担当していどのようなわかりませんよ。クエリを送信した後に接続を閉じる必要がありますか?また、EclipseLinkもこの接続を内部的に使用するため、接続を閉じることはできません。それとも、EclipseLinkが私の振る舞いを観察し、私がそれをしなければ自動的に接続を閉じるので気にしませんか?

+0

このJava EEまたはSEですか? – perissf

+0

プレーンJava SE環境。 – user1494080

+0

なぜ接続が必要ですか? JPAはほとんどの状況でEntityManagerを使用します。 – perissf

答えて

6

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

は、追加情報については、以下のリンクを参照してください。

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

+0

私は問題があります。エンティティマネージャでロールバックを実行する場合でも、トランザクションは常に変更をコミットします。私はInformix dbとifxjdbcドライバを使用しています。トランザクションはアプリケーション管理です。 2番目の問題は、eclipselinkがunwrap(java.sql.Connection)でnullを返すことです。古いSGES2.1.1でeclipselink 2.5.1を使用する。 – dmatej

+0

解決済み:EclipseLink wikiが間違っていましたが、unwrapメソッドが正しいです。私はEclipselinkのwikiを今日修正しました。 – dmatej

1

をしかし、私は、私が担当していどのようなわかりませんよ。クエリを送信した後に 接続を閉じる必要がありますか?または、私は への接続を閉じることができません。なぜなら、EclipseLinkもこの接続を 内部で使用するからです。

いいえ、有効な質問です。ドキュメントにはunwrap()コールのセマンティクスが欠落しているようです。私はsourceから得たものから応じてEclipseLinkのについて

、:

のEclipseLinkはあなたにそれが現在アクティブなクライアントセッショントランザクションのために使用していますconnection現在アクティブに参照を与えます。アクティブなトランザクションがない場合は、という新規のが作成され、セッションに関連付けられ、unwrap()メソッドから返されます。

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

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

関連する問題