2

Spring バッチを使用して複数のテーブルにデータを書き込む必要があります。たとえば、ユーザー テーブルと情報テーブルの 2 つのテーブルがあります。

ストアド プロシージャを使用したくありませJdbcItemwriterんが、複数の SQL を実行することはできません。で複数のSQLを実行したいJdbcItemWriter

これを実行する最適な方法についての指針と一般的なアドバイスを探しています。

4

3 に答える 3

3

通常、各要素に対して複数の挿入を行う必要があります。たとえば、ファイルから読み取る場合 (構造化された 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>

チャンク構造を尊重し、ロールバック、トランザクション、およびデータの整合性について心配する必要がないため、これはよりクリーンな実装だと思います。

于 2015-01-15T16:18:28.527 に答える
0

2 つのデリゲートでCompositeItemWriterを使用することもできます。JdbcItemWriter

于 2015-01-18T11:21:45.307 に答える