1

まず、私がやりたいことを説明してから、質問をします。次のことを行う必要があります。

  • いくつかの条件に対応するすべての行を一覧表示する
  • いくつかのテストを行います (例: まだ挿入されていないかどうかを確認します)。テストに合格した場合は、行を別のデータベースに挿入します。
  • 行の削除 (テストに合格したかどうか)

以下は私の実装です

List<MyObject> toAdd = new ArrayList<MyObject>();
for(MyObject obj:list){
    if(!notYetInserted(obj){
        toAdd.add(obj);
    }
}
myObjectDAO.insertList(toAdd);
myObjectDAO.deleteList(list);

サービス メソッドはトランザクションとしてマークされます。

私の DAO メソッドでは、deleteList と insertList はかなり似ているので、ここでは挿入用のメソッドを配置します。

public void insertList(final List<MyObject> list){
String sql = "INSERT INTO table_test " +
    "(col_id, col2, col3,col4) VALUES (?, ?, ?,?)";

List<Object[]> paramList = new ArrayList<Object[]>();

for (MyObject myObject : list) {
    paramList.add(new Object[] {myObject.getColId(), 
        myObject.getCol2(), myObject .getCol3(), myObject.getCol4()}
    );
}
simpleJdbcTemplate.batchUpdate(sql, paramList);        

}

このような操作を実行する最善の方法についてはわかりません。ここで、ループ内で更新を呼び出すとシステムの速度が低下する可能性があることを読みました (特に私の場合、一度に約 100K の挿入/削除があります)。DAO 内のこれらの追加のループがシステムの速度をさらに低下させないかどうか、また、そのバッチの処理中に問題が繰り返し発生した場合はどうなるのだろうか (テストをサービスから DAO に移動して、ループを 1 つだけにし、追加のテストを追加することも考えました。それが良いアイデアかどうかはわかりません)。そこで、アドバイスをお願いします。どうもありがとう。

PS: 詳細が必要な場合は、お気軽にお問い合わせください。

4

1 に答える 1

1

これは必ずしも悪いアプローチではありませんが、あなたの言う通り、非常に遅いかもしれません。これだけ多くの行を挿入または削除するこのようなプロセスを実行するとしたら、おそらくすべてストアド プロシージャで実行するでしょう。私のコードは proc を実行するだけで、proc はそれを介してリストと列挙 (および挿入と削除) を処理します。

于 2012-09-25T14:37:42.240 に答える