プロが教える店舗&オフィスのセキュリティ対策術

Webアプリ内でDB接続する場合にSQLの最大数(ResultSetやStatementの数)は指定できると思いますが、例えば3を指定した場合、以下の手順の2回目にはcloseしていないためエラーとなってしまうのでしょうか?

それともStatementなどをローカル変数にしておけばメソッド終了時などにcloseされて最大数に達することはないのでしょうか?
そのうち解放されるなどあるのかだんだんカウントアップされてしまうのかがよくわかりません。

1.Connectionを取得
2.StatementとResultSetを使用してSQL発行
3.close処理(Connectiion,Statement,ResultSet)は明示的に実施しない
4.何回か1と2を実施

public void test() {
 methodA();
 methodA();
 methodA();
}

public void methodA(){
 Connection con = getConnection();
 Statement st = con.getStatement();
 ResultSet rs = ・・・・
}

A 回答 (1件)

「おやっさん、このプログラム結果はどうなるねん」「前回って、 GC に聞いとくれ」


http://ja.wikipedia.org/wiki/%E9%B0%BB%E5%B1%8B_ …

con, st, rs にあるいずれのインスタンスも methodA() を抜けた時点でガベージコレクションの対象になります。また、Connection, Statement, ResultSet のインターフェースを実装したクラスでは、いずれもインスタンスが破棄される時点で保持しているリソースを開放するように実装されているのが普通です。

しかし、ガベージコレクションが処理対象となったインスタンスをいつ破棄するかはガベージコレクションの処理次第で、プログラマが関与できるものではありません。……System#gc()? ああ、そういうメソッドもありましたね。でも、それを実行したところでガベージコレクション対象のインスタンスが必ず解放されるという保証はありません。
http://www.ibm.com/developerworks/jp/websphere/l …
http://music.geocities.jp/kreisler_liebesleid/ja …
つまり、Java ではインスタンスを開放するタイミングを指定することはできません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!