mybatisマッパーを参照するDAOを介してデータを挿入すると、複数のテーブルが影響を受けます。
public void insertStuff(Collection<Stuff> data) {
for (Stuff item : data) {
mapper.insertT1(item.getT1Stuff());
mapper.insertT2(item.getT2Stuff());
Collection<MainStuff> mainData = item.getMainStuff();
for (MainStuff mainItem : mainData) {
mapper.insertMainData(mainItem);
}
}
}
mybatisのBATCHエグゼキュータタイプを使用していますが、メインループの各反復で3つのマッパーステートメントのそれぞれに対して新しいPreparedStatement(および新しいConnection)が作成されるため、OracleのMAX_CURSOR制限にすぐに到達しています。ループを複数回繰り返すことで、これを回避できます。
public void insertStuff(Collection<Stuff> data) {
for (Stuff item : data) {
mapper.insertT1(item.getT1Stuff());
}
for (Stuff item : data) {
mapper.insertT2(item.getT2Stuff());
}
for (Stuff item : data) {
Collection<MainStuff> mainData = item.getMainStuff();
for (MainStuff mainItem : mainData) {
mapper.insertMainData(mainItem);
}
}
}
ただし、後者のコードは読みにくく、パフォーマンス面で少しコストがかかり、モジュール性が損なわれます。
これを行うためのより良い方法はありますか?SqlSessionを直接使用し、特定の数がキューに入れられた後にステートメントをフラッシュする必要がありますか?