MyBatis Oracleデータベース・データの一括処理
今日はプロジェクト開発で大量挿入データが必要で、ネット上でコードを見つけやすいのですが、間違ったSQLが正しく終了していません.後で調べましたが、MySQLの大量挿入を使ったからです.
ここにOracleのバッチ挿入コードを貼り付けて記録します.
注意:insert文にvaluesキーは書かれていません.そうしないと、エラーが発生します.
シーケンス自己増加プライマリ・キーを使用しない場合は、次のようになります.
一括更新:
一括削除:
注意:
jdbcTypeは通常は書かなくてもいいですが、nullがある場合はjdbcTypeを宣言する必要があります.そうしないとエラーが発生します.
ポイント:ロットinsertの効率問題!
その後、プロジェクトでは、データが少し大きいため、例えば1万件以上ある場合、ロットinsertの効率が異常に悪くなり、20分以上かかり、さらに長くかかります.むしろjavaでforループで1つのデータが挿入されるたびに.後で調べてみると、挿入するリストをjavaでsubListメソッドで分割し、複数回処理することができます.コードは以下の通りです:(このコードはネット上でも見つかりますが、彼らの論理に問題があることに気づき、一部のデータが漏れ、修正しました)
サービス実装クラスの主なコード:
以上のように、大きなデータをバッチ処理することで、ある程度効率を向上させることができる.ロットごとに挿入するデータ量を試したことがありますが、サイズが500の場合、相対効率は800や1000よりずっと高く、他のデータ量のサイズは試したことがありません.
ここにOracleのバッチ挿入コードを貼り付けて記録します.
INSERT INTO TABLE_NAME
(ID,NAME,VALUE)
SELECT SEQUENCE.NEXTVAL ID,A.* FROM (
SELECT
#{item.name,jdbcType=VARCHAR},
#{item.value,jdbcType=DOUBLE}
FROM DUAL
) A
注意:insert文にvaluesキーは書かれていません.そうしないと、エラーが発生します.
シーケンス自己増加プライマリ・キーを使用しない場合は、次のようになります.
INSERT INTO TABLE_NAME
(ID,NAME,VALUE)
SELECT
#{item.id,jdbcType=VARCHAR},
#{item.name,jdbcType=VARCHAR},
#{item.value,jdbcType=DOUBLE}
FROM DUAL
一括更新:
update table_name set
value = #{item.value,jdbcType=DOUBLE}
where id = #{item.id,jdbcType=VARCHAR}
一括削除:
delete from table_name
where id = #{item.id} and name = #{item.name}
注意:
jdbcTypeは通常は書かなくてもいいですが、nullがある場合はjdbcTypeを宣言する必要があります.そうしないとエラーが発生します.
ポイント:ロットinsertの効率問題!
その後、プロジェクトでは、データが少し大きいため、例えば1万件以上ある場合、ロットinsertの効率が異常に悪くなり、20分以上かかり、さらに長くかかります.むしろjavaでforループで1つのデータが挿入されるたびに.後で調べてみると、挿入するリストをjavaでsubListメソッドで分割し、複数回処理することができます.コードは以下の通りです:(このコードはネット上でも見つかりますが、彼らの論理に問題があることに気づき、一部のデータが漏れ、修正しました)
サービス実装クラスの主なコード:
ArrayList list = new ArrayList<>();// list
int count = 0; //
if (list != null && list.size() > 0) {
int batchCount = 500; //
int batchLastIndex = batchCount; // list
for (int index = 0; index < endowList.size(); ) { // index
if (batchLastIndex >= endowList.size()) {
// list size , list size,subList
batchLastIndex = endowList.size();
count += testDao.insertAll(list.subList(index, batchLastIndex),table_name);
break; // ,
} else {
count += testDao.insertAll(list.subList(index, batchLastIndex),table_name);
// insert ,
index = batchLastIndex;
// +
batchLastIndex = index + batchCount;
}
}
}
return count;
以上のように、大きなデータをバッチ処理することで、ある程度効率を向上させることができる.ロットごとに挿入するデータ量を試したことがありますが、サイズが500の場合、相対効率は800や1000よりずっと高く、他のデータ量のサイズは試したことがありません.