ガベージコレクターに関する質問。データベース接続を作成し、データベースに対していくつかの操作を実行した後、接続オブジェクトを長期間使用しなかった場合、ガベージコレクターによって接続が解放される可能性があります。この接続を後で使用したい。
編集:確認のために、接続を作成した場合、Webアプリケーションのコンテキストレベルにある場合はどうなりますか?
オブジェクトへの強力な参照を保持しているConnection
場合、ガベージコレクターがオブジェクトに触れることはなく、データベース接続は維持されます。複数のスレッドで使用できないことを覚えておいてください。
一方、接続を開いたままにしておく時間が長すぎると、一部の基盤となるリソース(TCP / IPソケットなど)が中断される可能性があります。
接続への最後の参照を失うと(それを上書きするか、に設定することによりnull
)、ガベージコレクターは接続に関連付けられているすべてのJavaオブジェクトと接続自体を解放します。ただし、基になるデータベース接続は解放されないため、常に明示的に呼び出す必要があります。
connection.close();
一言で言えば、JVMガベージコレクション:あなたまたは他の誰かがオブジェクトへの参照を持っている場合、JVMはそれをガベージコレクションすることを許可されていません。それへの参照がない場合、JVMは必要になるまでガベージコレクションを行う必要はありません。
接続への参照を保持している限り、接続はガベージコレクションされません。したがって、理論的には、好きなだけ使い続けることができます。
接続オブジェクトを参照しなくなった場合、それはガベージコレクションのメンバーですが、gcによってガベージコレクションされることを保証することはできません。それは完全にgcに依存します。
将来使用する場合は、グローバルオブジェクトにすることをお勧めします。アプリケーションが参照を保持し、ガベージコレクションのメンバーにならないようにします。
接続の参照の種類によって異なります。強い参照がある場合はガベージコレクションされませんが、弱い参照がある場合はGCの対象になります。
静的レベルまたはインスタンスレベルで保持されている場合、ガベージコレクションは行われません。
ただし、データベース接続を長時間保持するのではなく(すべてのデータベースに接続数に制限があることを考慮すると)、必要に応じて解放して再取得する必要があります。
接続管理を改善するために、ConnectionPoolの使用も検討する必要があります。