私のJavaコードの中で私は、JDBC接続を介してMySQLデータベースと対話します。Iセットアップ接続と(再利用のための)いくつかのステートメント
connect = DriverManager.getConnection(connectionstring);
statement = connect.createStatement();
statement2 = connect.createStatement();
コードのほとんどは、statement.executeQuery(クエリ)は大丈夫ですが、私は彼らがいずれかのすべて一緒に通過することを確認する必要があり、またはそれらのどれも行いませんので、いくつかの操作は、「ブロック」です。私は、次のコードは、これを実現信じています。
connect.setAutoCommit(false);
statement.addBatch(insertquery1);
statement.addBatch(insertquery2);
statement.addBatch(insertquery3);
statement.addBatch(insertquery4);
statement.executeBatch();
connect.commit();
connect.setAutoCommit(true);
私の知る限り、接続通話が接続全体に影響を与えるとして、その声明文2との両方に影響を与えます。また、私は一見のAutoCommit値を設定することができた後、私は文オブジェクトを作成し、それはまだそれに適用されます。これは正しいです?そして、それらを分割し、すぐ下のような自動コミット・コールのために異なる接続オブジェクトを保持するために練習/より効率的に、より良いでしょうか?
// objects purely for batch operations
connect = DriverManager.getConnection(connectionstring);
connect.setAutoCommit(false);
statement = connect.createStatement();
// objects for normal operations
connect2 = DriverManager.getConnection(connectionstring);
connect2.setAutoCommit(true);
statement2 = connect2.createStatement();
私のアプリケーションでは、彼らは、呼び出しの1%未満を表すが、その割合は、バッチで実行する必要がありません。ベストプラクティスは何ですか?
自動falseにコミット設定の全体のポイントは、複数のSQL文はすべて同じトランザクション内で実行できるようにということです。そして、あなたの4つのINSERT文のいずれかを使って何を行く間違っては、全体のトランザクションは、論理的に、あなたのデータベースで一貫性のないデータで終わるしないようにすることを、ロールバックされます必要があります。あなたは既に次されているパターンがベストプラクティスです。
connect.setAutoCommit(false);
statement.addBatch(insertquery1);
statement.addBatch(insertquery2);
statement.addBatch(insertquery3);
statement.addBatch(insertquery4);
statement.executeBatch();
connect.commit();
connect.setAutoCommit(true);
つまり、自動あなたのトランザクションを完了した後に真であることにコミット戻すためのベストプラクティスである、です。これはあなたのコード、または多分あなたの将来のコードの他の部分、まだ同じ接続オブジェクトを使用すべき他の誰か継承それは、本当のこと自動コミットのデフォルトの動作を受け取ることになるようです。