2011-10-24 18 views
1

でデータベース接続を閉じる:私は与えられたSQL文の結果セットを返す私のデータベースクラスに次のメソッド持ちのJava

public static ResultSet sqlStatement(String query) throws SQLException{ 
    ResultSet result = null; 
    Connection conn = connect(); 
    Statement newStatement = conn.createStatement(); 
    result = newStatement.executeQuery(query); 
    conn.close(); 
    return result; 
} 

を、私は私が結果セットを返す前に、データベースへの接続をクローズしたいが、次の例外をスローします。

java.sql.SQLException: out of memory 

私はJavaのnoobですので、どんな助けでも大歓迎です。

+0

は-Xmxの起動パラメータを経由して、あなたのメモリを増やすか、など多くの行を返さない役立つだろうホープ - あなたはどのように多くのを知っていますクエリが返されますか? –

+0

あなたはどのデータベースを使用していますか?あなたの質問を投稿してもらえますか?メモリが不足しているデータベース自体であるかのように見えます。 –

+0

約4列3行のテーブルで、ステートメントは "SELECT * FROM table"です。私はかなりメモリ問題を引き起こさないことを確認しています。 – Alex

答えて

1

を使い果たし、データベース自体だ、私は「ResultSetを」理解するであろう私はあなたのクエリを実行するときにデータベースからいくつかの行をキャッシュすることを賭ける..

したがって、接続を閉じて、次のキャッシュなど。その結果、メモリ例外が発生します。

Javaでそれらを使用するためにとにかく適切な方法..

Connection con... 
try{ 
    create connection 
    execute query 
    use your resultset completely.. 
}catch(...){ 
}finally{ 
    close connection; 
} 

はそれが

+0

助けてくれてありがとう、私はメソッドでArrayListを作成してこれを返さなければならないと思います。テーブル構造を維持する方法がわからない – Alex

1

finallyブロックにconn.close()を入れて、例外がスローされた場合に実行イベントになるようにします。

+2

これがメモリ不足の例外の理由であるとは思わない –

0

常に、常に、finallyブロック内のデータベースリソースを常に閉じます。

あなたのロジックがそのまま動作するのか疑問です。 ResultSetは、接続が開いている間のみ使用できます。接続を終了する前に、結果セット全体を処理する必要があります。

+0

JavaDocから、結果のStatementがクローズされた場合、ResultSetがクローズされるように見えます。これは、ResultSetとStatementの両方の 'close()'メソッドのdocに記述されています。ただし、Connectionの終了に関する情報はありません。ステートメントが閉じられていない限り、接続を閉じることは安全です。 –

+0

結果セットをJavaオブジェクトに変換して、テーブル構造を保持する方法はありますか?私はarraylistとのやり方を考え出すことができると思います。 – Alex

+1

@G_H、no:接続を閉じると、その接続によってオープンされたステートメントが閉じられ、結果セットも閉じます。これはドキュメントでは明示的には言及されていませんが、Connectionで 'SQL文が実行され、結果が接続のコンテキスト内で返されます'とConnectionに言及します。close(): 'このConnectionオブジェクトのデータベースおよびJDBCリソースを、自動的に解放されるのを待つのではなく、ただちに解放します。'これは、接続を閉じるときにも文が閉じられていることを意味します。 –

0

finallyブロックのリソースを閉じること以外にも、PreparedStatementResultSetを閉じる必要があります。実際には、ResultSetを返信しないようにしてください。代わりに、それをList<Object[]>のような何らかの中間データストアに読み込むことができます。一方、あなたはjava.lang.OutOfMemoryError

を取得していないので、おそらくそれは私の過去の経験(ノー文書または何か)にメモリ

関連する問題