私はJavaでDB接続プールを作成しています。それはたくさんの接続を保持し、それらを提供するクラスです。Java - メモリ管理/ DB接続の質問
私のクラスのインスタンスが範囲外になったときにDB接続が閉じられるように、ある種のデストラクタメソッドが必要ですか?
編集: これはのためだけに学習目的です。私は間違いなく、実稼働環境で信頼性の高いオープンソース接続プールを使用します。私は実際にはメモリ管理の意味を理解したいだけです。
私はJavaでDB接続プールを作成しています。それはたくさんの接続を保持し、それらを提供するクラスです。Java - メモリ管理/ DB接続の質問
私のクラスのインスタンスが範囲外になったときにDB接続が閉じられるように、ある種のデストラクタメソッドが必要ですか?
編集: これはのためだけに学習目的です。私は間違いなく、実稼働環境で信頼性の高いオープンソース接続プールを使用します。私は実際にはメモリ管理の意味を理解したいだけです。
の下のいずれかを使用することをお勧めします私の頭の中に、あなたの物体、あなたの鍵があると言う。あなたのキーに一意のIDを実装します。 hashCode()
は良い出発点です。オブジェクトを作成するときは、オブジェクトをWeakReference
に置き、ReferenceQueue
に関連付けます。今度はMap<int, Connection>
へのキーとしてhashCodeを使用してください。オブジェクトが有効範囲外になったら、ReferenceQueue
に移動してオブジェクトを取得します。hashCode
を使用してConnection
をMap
から取得して閉じます。参照here
上
参照のチュートリアルでは、それを行うための正しい方法は、プールを介して「接続」というを与える、のjava.sql.Connectionを実装する独自のクラスで接続インスタンスをラップすることです。あなたは、 "本当の"接続に喜んで渡すことができるすべてのメソッドを実装するように強制されます。 one - close()を除く。この方法では、接続を閉じずにプールに戻す必要があります。
オブジェクトをスコープから外すだけでプールに戻すことはできません。それをプールに返すfinalize()に何かを置くことができますが、これは危険です。 Finalize()は任意のオブジェクトに対して一度だけ実行されるので、オブジェクトを「キャッチ」してgcされないようにするには、finalize()を呼び出さないようにします。
または誰にでも切り替えることです:あなたの提案したデザインでは、接続時に呼び出されます。しかし、私のプログラムが終わるとどうなりますか?実際に接続を閉じるにはどうしたらいいですか? (明示的に閉じないと、MySQLはそれらを少なくともしばらく開いたままにしているように見えます) – Greg
プログラムが終了すると、通常は気にしません。dbサーバはそれを把握します。私たちは実際に生産時に-9台のサーバを殺します。しかし、実行時には洗練され、プール内で使用可能な接続がしばらくの間その数を超えたことを認識してプールから削除することができます。 –
学習目的です。チル – Greg
@Mitch @Gregあなたの両方のコメントをアップしました... – Waldheinz