2

SQLServer2008データベースに接続して変更を実行するJavaプログラムがあります。変更したいレコードが100万ある場合、次のようにするのは悪い習慣ですか。

for(all of the records I need to modify) {
    PreparedStatement pst = conn.prepareStatement(someQuery);
    // set record specific parameters for pst
    // execute pst
}

または、単一のクエリを作成して実行する必要がありますか?それは違いを生むでしょうか?それがUPDATE、INSERT、またはDELETEのいずれであるかによって異なりますか?私のSQLの知識は非常に基本的です。

4

2 に答える 2

1

クエリがすべての反復で同じである場合は、反復の前に作成し、提案されているようPreparedStatementに反復の最後に呼び出します。PreparedStatemetn.executeBatch()Jesse Webb

トランザクションをコミットせずにレコードを更新または削除すると、データベースの他のユーザーに問題を引き起こす可能性のあるレコードの変更がロックされるため、数回の反復後に(1000回の反復ごとに)トランザクションをコミットすることをお勧めします(あなたがそれらのデータベースオブジェクトの唯一のクライアントではない場合!)。

于 2012-07-11T16:41:14.603 に答える
0

大量のUPDATEの場合は、を使用するのが最適Statement.executeBatch()です。

例として「javaexecutebatchexample」をグーグルで試してみてください。

トランザクションを適切に使用することもお勧めします。クエリのオーバーヘッドの多くは、多くのステートメントに単一のトランザクションを使用する方がはるかに効率的である暗黙のトランザクション(クエリごとに1つ)から発生します。

于 2012-07-11T16:24:55.053 に答える