1

現在、このアプリケーションはSpring、SimpleJdbcTemplate、MySQLを使用しています。

使用されるデータソースは、URLプロパティ「rewriteBatchedStatements=true」を持つorg.apache.commons.dbcp.BasicDataSourceです。

を使用したバッチ挿入中に、SimpleJdbcTemplate.batchUpdate(List<Object[]>)入力バッチに(挿入しているテーブルの主キーに基づいて)重複するレコードがあります。

重複レコードのシナリオでは、次のことが可能です。

1)重複していないすべてのレコードを挿入し、成功した挿入の数に関する応答を取得しますか?

また

2)batchInsertを完全にロールバックします。レコードを挿入しないでください。

mysqlの「INSERTIGNORE」を使用して、最初の要件を部分的に達成することができます。ただし、SimpleJdbcTemplate.batchUpdate()すべてのレコードが更新されたものとして返されます(重複を無視して、挿入されたレコード数のみをキャプチャすることはできません)

そして、2番目の要件を達成するには、「rewriteBatchedStatements」をオフにする必要があります。ただし、このパラメーターは、パフォーマンステスト後に微調整されています。したがって、これを「false」に設定することはできません。

最初の行で述べたように、使用しているコンポーネントの制約内で、上記の2つのケースのいずれかを達成することは可能ですか?

私は春とjdbcの世界に慣れていないので、詳細な説明が私たちをより良くするのに役立ちます。ありがとう

4

1 に答える 1

1

1)重複していないすべてのレコードを挿入し、成功した挿入の数に関する応答を取得しますか?

=>できます。重複していないすべてのレコードを挿入して、応答を取得します。つまり、バッチ内の各更新(挿入/更新)の影響を受ける行数を表す整数の配列をbatchUpdate()返します。int[]

2)batchInsertを完全にロールバックします。レコードを挿入しないでください。

=> batchInsertは単一のトランザクション内にあるため、すべてのレコードが挿入されるか、レコードが挿入されません。トランザクションがコミットされると、すべてのレコードが挿入されます。@Transactional例外が発生した場合、Springトランザクション管理(アノテーションまたはを使用)を使用している場合、トランザクションは自動的にロールバックされますspring aop based tx advice。ここで、必ず設定してくださいBasicDataSource.defaultAutoCommit = false

于 2012-07-11T09:29:27.820 に答える