0

私はJavaでDB接続プールを作成しています。それはたくさんの接続を保持し、それらを提供するクラスです。Java - メモリ管理/ DB接続の質問

私のクラスのインスタンスが範囲外になったときにDB接続が閉じられるように、ある種のデストラクタメソッドが必要ですか?

編集: これはのためだけに学習目的です。私は間違いなく、実稼働環境で信頼性の高いオープンソース接続プールを使用します。私は実際にはメモリ管理の意味を理解したいだけです。

+1

学習目的です。チル – Greg

+1

@Mitch @Gregあなたの両方のコメントをアップしました... – Waldheinz

答えて

2

学習目的でこれを実行しようとしている場合は、何をしているかは問題ありません。下記のライブラリのいずれかのソースコードをダウンロードし、コードを参照してください。これは、接続のライフサイクルをどのように処理しているかを理解するのに役立ちます。本番アプリケーションの一部としてそれを使用したい場合は

しかし、私は非常にすぐ上から

  1. BoneCP
  2. c3p0
+0

DBCPも同様に動作します。 – rfeak

+0

私はそれについて言及していませんでした。何か問題があったので、私が受け取った一般的な勧告はc3p0 –

2

の下のいずれかを使用することをお勧めします私の頭の中に、あなたの物体、あなたの鍵があると言う。あなたのキーに一意のIDを実装します。 hashCode()は良い出発点です。オブジェクトを作成するときは、オブジェクトをWeakReferenceに置き、ReferenceQueueに関連付けます。今度はMap<int, Connection>へのキーとしてhashCodeを使用してください。オブジェクトが有効範囲外になったら、ReferenceQueueに移動してオブジェクトを取得します。hashCodeを使用してConnectionMapから取得して閉じます。参照here

1

参照のチュートリアルでは、それを行うための正しい方法は、プールを介して「接続」というを与える、のjava.sql.Connectionを実装する独自のクラスで接続インスタンスをラップすることです。あなたは、 "本当の"接続に喜んで渡すことができるすべてのメソッドを実装するように強制されます。 one - close()を除く。この方法では、接続を閉じずにプールに戻す必要があります。

オブジェクトをスコープから外すだけでプールに戻すことはできません。それをプールに返すfinalize()に何かを置くことができますが、これは危険です。 Finalize()は任意のオブジェクトに対して一度だけ実行されるので、オブジェクトを「キャッチ」してgcされないようにするには、finalize()を呼び出さないようにします。

+0

または誰にでも切り替えることです:あなたの提案したデザインでは、接続時に呼び出されます。しかし、私のプログラムが終わるとどうなりますか?実際に接続を閉じるにはどうしたらいいですか? (明示的に閉じないと、MySQLはそれらを少なくともしばらく開いたままにしているように見えます) – Greg

+0

プログラムが終了すると、通常は気にしません。dbサーバはそれを把握します。私たちは実際に生産時に-9台のサーバを殺します。しかし、実行時には洗練され、プール内で使用可能な接続がしばらくの間その数を超えたことを認識してプールから削除することができます。 –