Spring バッチを使用して複数のテーブルにデータを書き込む必要があります。たとえば、ユーザー テーブルと情報テーブルの 2 つのテーブルがあります。
ストアド プロシージャを使用したくありませJdbcItemwriter
んが、複数の SQL を実行することはできません。で複数のSQLを実行したいJdbcItemWriter
。
これを実行する最適な方法についての指針と一般的なアドバイスを探しています。
Spring バッチを使用して複数のテーブルにデータを書き込む必要があります。たとえば、ユーザー テーブルと情報テーブルの 2 つのテーブルがあります。
ストアド プロシージャを使用したくありませJdbcItemwriter
んが、複数の SQL を実行することはできません。で複数のSQLを実行したいJdbcItemWriter
。
これを実行する最適な方法についての指針と一般的なアドバイスを探しています。
通常、各要素に対して複数の挿入を行う必要があります。たとえば、ファイルから読み取る場合 (構造化された XML など)。そのために、私は通常ItemWriter
、プロパティがJdbcItemWriter
各テーブルの特定のクラスである特定のクラスを実装します。次に例を示します。
package my.package.writer;
import my.package.model.tbl.MyMainObject;
import my.package.model.tbl.MySubObject1;
import my.package.model.tbl.MySubObject2;
import org.springframework.batch.item.ItemWriter;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
public class MainMultipleWriter implements ItemWriter<PkjwdPolizze>
{
private CounterBean counterBean;
private ItemWriter<MyMainObject> writerMyMainObject;
private ItemWriter<MySubObject1> writerSubObject1;
private ItemWriter<MySubObject2> writerSubObject2;
@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
public void write(List<? extends MyMainObject> items) throws Exception
{
// Main Table WRITER
writerMyMainObject.write(items);
// Secondary Table WRITERS
for (MyMainObject item : items)
{
writerSubObject1.write(item.getLstMySubObject1());
writerSubObject2.write(item.getLstMySubObject2());
}
}
}
MultiWriter
この後、単純な の代わりにクラスを使用するようにジョブを構成しますJdbcItemWriter
。その構成の例を次に示します。
<!-- job -->
<batch:job id="myJob" job-repository="jobRepository" restartable="false">
<batch:step id="myStep" >
<batch:tasklet transaction-manager="transactionManager">
<batch:chunk commit-interval="2500" reader="myReader"
processor="myProcessor" writer="myMultiWriterBean" />
</batch:tasklet>
</batch:step>
</batch:job>
<!-- Writers -->
<bean id="myMainObjectWriter" class="org.springframework.batch.item.database.JdbcBatchItemWriter">
<property name="itemPreparedStatementSetter">
<bean class="my.package.setters.MyMainObjectStatementSetter"></bean>
</property>
<property name="sql" value="--insert_statement--" />
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="mySubObject1Writer" class="org.springframework.batch.item.database.JdbcBatchItemWriter">
<property name="itemPreparedStatementSetter">
<bean class="my.package.setters.MySubObject1StatementSetter"></bean>
</property>
<property name="sql" value="--insert_statement--" />
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="mySubObject2Writer" class="org.springframework.batch.item.database.JdbcBatchItemWriter">
<property name="itemPreparedStatementSetter">
<bean class="my.package.setters.MySubObject2StatementSetter"></bean>
</property>
<property name="sql" value="--insert_statement--" />
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="myMultiWriterBean" class="my.package.writer.MainMultipleWriter">
<property name="writerMyMainObject" ref="mySubObject1Writer" />
<property name="writerSubObject1" ref="mySubObject2Writer" />
<property name="writerSubObject2" ref="mySubObject2Writer" />
</bean>
チャンク構造を尊重し、ロールバック、トランザクション、およびデータの整合性について心配する必要がないため、これはよりクリーンな実装だと思います。
2 つのデリゲートでCompositeItemWriterを使用することもできます。JdbcItemWriter