2017-02-11 15 views
1

C3P0NativeJdbcExtractorを使用して、以下のようにネイティブJDBC接続を抽出しています。C3P0NativeJdbcExtractorのConnection.close()は接続を閉じてプールから削除します

public Connection getNativeConnection() throws SQLException{ 
     C3P0NativeJdbcExtractor nativeJbdc; 
     nativeJbdc = new C3P0NativeJdbcExtractor(); 
     return nativeJbdc.getNativeConnection(dataSource.getConnection()); 
    } 

ここで、データソースはC3P0接続プールから取得されていることに注意してください。このメソッドで返されたConnection.close()を実行すると、実際にプールに戻る代わりに接続が閉じられています。

ただし、アンラップされた接続を閉じると、プールに戻されます。

ここでラップされた接続を閉じると、接続をプールに戻すことができないのはなぜですか?

+0

抽出された接続にラップされ、プールから取得された接続に対してラップされているように見えるので、あなたの質問は_wrapped_と_unwrapped_の意味を混同していると思います。 –

答えて

2

c3p0のような接続プールには、JDBCドライバによって作成された物理(「ネイティブ」)接続の集合が保持されます。接続を要求すると、論理接続とも呼ばれるプロキシで物理接続がラップされます。

このプロキシは、Connection.close()のような特定の方法を傍受します。接続を閉じる代わりにclose()の場合、論理接続は無効になり、クローズ接続として動作し、物理接続を接続プールに戻します。

コードでは、論理接続から物理接続を抽出して返すので、その代わりにclose()を呼び出すと、プールに返す代わりにデータベースへの接続が閉じられます。

このようなネイティブ接続を抽出する理由はほとんどありません。唯一の理由は、ドライバ固有の機能にアクセスする必要がある場合です。できるだけ標準JDBCを使用して、本当に必要なときにドライバ特有の機能にアクセスするようにしてください。

close()を呼び出すときは、アンラップされた物理接続ではなく、接続プールから受け取った論理接続でclose()を呼び出してください。

+0

これは私が探していたものです。助けてくれてありがとう。未知のネイティブ接続を使用してパッケージ呼び出しを行う理由で、標準JDBCを使用しています。その間、データソースからnativeC3P0Extractorを使用して接続を取得しています。 – MADDY987

+0

@ MADDY987私の答えがあなたの問題解決に役立ったなら、私の答えを受け入れることを検討してください。http://stackoverflow.com/help/someone-answers –

関連する問題