2012-02-25 9 views
2

以下のうちどれが正しいか(それは重要ですか)。whileループで文を使用するJavaを作成

Connection conn = null; 
conn = DriverManager.getConnection (url, userName, password); 
Statement st = conn.createStatement(); 
while (a.b()) { 

    st.executeUpdate(blah blah); // same statement with different data values 

} 
st.close(); 
conn.close(); 





finally 
      { 
       if (conn != null) 
       { 
        try 
        { 
         conn.close(); 
        } 
        catch (Exception e) { } 
       } 
      } 
     } 

又は

Connection conn = null; 
conn = DriverManager.getConnection (url, userName, password); 
while (a.b()) { 
    Statement st = conn.createStatement(); 
    st.executeUpdate(blah blah); //same statement with different data values 
    st.close(); 
} 
conn.close(); 




    finally 
      { 
       if (conn != null) 
       { 
        try 
        { 
         conn.close(); 

        } 
        catch (Exception e) { } 
       } 
      } 
     } 
+0

「finally」ブロックで接続を閉じることをお勧めします。 – DNA

+0

私はすでにそれを行っています。私のコードを更新しています。 – Ank

答えて

2

ループ外の文を作成する方が洗練されていて、やや高速かもしれませんが、あなたのケースで大きな違いがあるかどうかを判断するためにプロファイルする必要があります。

ループが異なるデータ値で同じことをしている場合は、速度としてはPreparedStatementが好ましいでしょう。

+0

はいループは異なるデータ値で同じことをしています。私はPreparedStatementについて読むでしょう – Ank

+0

パフォーマンス以外の2番目のケースにPreparedStatementの利点がありますか? – Ank

+1

@Ankur 2番目のケースは、準備されたステートメントの利点を否定します。これを一度準備し、必要な回数だけループ内で再利用するという考え方です。 – dasblinkenlight

2

ループ内の更新が正確に同じ文を再利用した場合、その後、最初の形態が好ましいです。それどころか、ステートメントが繰り返しごとに変わると、2番目のフォームに固執します。

+2

合意 - キャッシング準備された声明は非常に助けになるでしょう。事柄の正確な性質に依存しますが、文は単一の一括更新に書き換え可能である必要があります。 –

2

実際にはPreparedStatement with placeholdersを使用し、最初の例のように1回だけステートメントを作成する必要があります。

+0

パフォーマンス以外の2番目のケースにPreparedStatementの利点がありますか? – Ank

+1

2番目の例でやっているように、 'Statement'オブジェクトを作成して破棄することが考えられる正当な理由はありません。あなたは割り当てる必要のないメモリを割り当てようとしており、GCはこれを処理する必要があります。 –

2

私は、上記の場合には大きな違いがないと思う - それは長い時間のために開いたままにするのに十分な仕事が間にあります場合は、ステートメントを閉じたい - ドキュメントごとに:

リリースこのStatementオブジェクトのデータベースとJDBCリソースのではなく、ただちに自動的に閉じているときにこの現象が発生するのを待ちます。一般的に、データベースリソースの枯渇を避けるためにリソースを終了するとすぐにリソースを解放することをお勧めします。

SQLが変更されない限り、あなたが指定した最初の方法を使用してPreparedStatementを代わりに使用することをお勧めします。

+0

パフォーマンス以外の2番目のケースにPreparedStatementの利点がありますか? – Ank

+1

PreparedStatementで言及した2番目の方法を使用したくないです。 PreparedStatementsのアイデアはできるだけそれらを再利用することです。より多くの時間を費やすことでメリットが減少します。パフォーマンスと、複数の呼び出しがある場合のみのパフォーマンス以外の利点はありません。 –

+0

私は、2番目のケースで説明した方法をCreateStatementで使用するか、PreparedStatementで最初のケースを使用することを意味しませんでした。パフォーマンス以外にPreparedStatementに利点がありますか? – Ank

1

どちらも正しくありません。まったく同じクエリを繰り返し実行するのではなく、異なる値を持つと仮定すると、プレースホルダを持ち、各ループの繰り返しで異なる値を提供するクエリで(単一の)PreparedStatementを使用する必要があります。

プリペアドステートメントを使用すると、Java側で効率的になります(オブジェクトの作成とGCコストの削減による)。また、JDBCドライバの動作に応じて、データベース側の負荷を軽減できます。

もう1点は、tryfinally句のPreparedStatementとConnectionを閉じる必要があることです。そうしないと例外がスローされると、コードはデータベース接続をリークします。後で問題が発生する可能性があります。