2011-07-15 3 views
9

PreparedStatementsとResultSetsを使用すると、使用するたびに「新しいデータベース・インスタンス」が作成されますか? 他の言葉で言えば、PreparedStatementとResultSetを使用する場合は、使用するたびに終了するか、終了したら終了する必要がありますか?PreparedStatementsのクローズ

例:

while (...){ 
     p = connection.prepareStatement(...); 
     r = p.executeQuery(); 
     while (r.next()) { 
     .... 
     } 
} 
// We close at the end. Or there are any other p and r still opened...? 
p.close(); 
r.close(); 

OR

while (...){ 
     p = connection.prepareStatement(...); 
     r = p.executeQuery(); 
     while (r.next()) { 
     .... 
     } 
     p.close(); 
     r.close(); 
} 

注:もちろん私は、これは一例であり、試してみて、適切に閉じ使用します。

+0

finallyブロックで閉じると、実行時例外があっても閉じられるようになります – chedine

答えて

5

あなたが開いたすべてを閉じる必要があります。プリペアドステートメントまたは結果セットを作成すると、データベースはそれらのリソースを割り当てます。クローズすると、それらのリソースを解放するようにデータベースに指示します(データベースはタイムアウト期間後にこれらのリソースを最終的に再割り当てします)。先に進んでクリーンアップしてください)。第2の例は、準備されたステートメントの前に結果セットを閉じることを除いて、より優れています。近くには醜いですから

while (...){ 
     PreparedStatement p = connection.prepareStatement(...); 
     try { 
      ResultSet r = p.executeQuery(); 
      try { 
      while (r.next()) { 
       .... 
      } 
      } finally { 
      try { 
       r.close(); 
      } catch (SQLException e) { 
      // log this or something -- prevent these from masking original exception 
      } 
      } 
     } 
     finally { 
      try { 
      p.close(); 
      } catch (SQLException e) { 
      // log this or something -- prevent these from masking original exception 
      } 
     } 
} 

が例外をキャッチしていますが、準備されたステートメントの実行中にスローされた例外を持っている場合、または結果の横断中:トライブロックとそう

は、それは次のようになり含めます準備されたステートメントや結果セットを閉じるときに例外がスローされるのではなく、あなたがそれを見ているかどうかを確認する必要があります(ネットワークの不具合のせいで何とかすることはできません)。

try-with-resourceを使用すると、データベース操作が成功したが例外が発生した場合に例外がスローされるケースがあることに注意してください。

iffyまたは冗長jdbcを手作業で起動するのではなく、spring-jdbcライブラリ(あなたのためにすべてを処理する)を使用することをお勧めします。

+0

ここに助けが必要ですか? :) http://stackoverflow.com/questions/35849664/sonar-close-this-preparedstatement –

5

最初の方法が優れています。

ただし、使用しているSQLが毎回同じである場合は、プリペアドステートメント(したがって、「準備済み」という名前)を再使用できることを理解する必要があります。たとえば:あなたは、定型の多くは、あなたがそのようクエリルーチンの因数分解おきたいことをここがあることを認識し、春、またはApache DbUtils、または類似を使用するために

//Note: try/catch/finally blocks removed for brevity 
p = connection.prepareStatement(...); 
while (...){ 
    r = p.executeQuery(); 
    while (r.next()) { 
     .... 
    } 
    r.close(); 
} 
p.close(); 
+1

準備されたステートメントを再利用するための+1 –

+0

ここの助け? :) http://stackoverflow.com/questions/35849664/sonar-close-this-preparedstatement –

1

たくない場合でもできるだけそれを繰り返す必要があります。