決戦データベース-spring batch(4)データベースからデータベースに

7744 ワード

決戦データベース-spring batch(4)データベースからデータベースに
tags:springbatch
記事の目次
  • 決戦データベース-spring batch(4)データベース
  • .引用
  • .開発環境
  • .開発プロセス
  • 3.1ターゲットデータベースを作成する
  • 3.2マルチデータソース
  • を構成する.
  • 3.3リードデータコンポーネント`JdbcCurrsorItemReader`
  • を追加します.
  • 3.4カスタム処理コンポーネント`Db 2 DbItem Processor`
  • 3.5書き込みデータセット`JdbcBatch ItemWriter`
  • を追加します.
  • 3.6完全任務を組み立てる
  • 3.7テスト
  • .まとめ
  • 1.引用
    前の記事「快速使用コンポーネント-spring batch(3)ファイルデータをデータベースに読み出す」は、Spring Batchの読み取り、処理、書き込みコンポーネントを紹介し、実際のケースでFlatFileItemReaderを使用してテキストファイルを読み、各行のデータをエンティティにマッピングし、JdbcBatchItemWriterを使用して、エンティティオブジェクトデータをMySQLに記憶する.しかし、データ統合の実用的なアプリケーションでは、より多くの作業は、AデータベースからBデータベースには、データベースの間で異質であり、データとデータのフィールド定義は同じではないので、データの同期、データ抽出時には、ソースデータベースからデータを読み込む必要があります.本文は前のページをベースにして、データベースからデータベースへのデータ同期を実現します.簡単に言えば、ファイルからデータをデータベースから読んでください.プロジェクトコードの完全な例をダウンロードできます.
    2.開発環境
  • JDK:jdk 1.8
  • Spring Boot:2.1.4.RELEASE
  • Spring Batch:4.1.22.RELEASE
  • 開発IDE:IDEA
  • 構築ツールMaven:3.3.9
  • ログコンポーネントlogback:1.2.3
  • lombook:1.18.6
  • 3.開発プロセス
    前の記事では、Userデータはmytestデータベースに格納されており、本明細書ではmytestデータベースのtest_userテーブルをソースデータとし、Spring Batchを使用してターゲットデータベースmy_test1にデータを同期させ、MySQLからMySQLまでの同期を実現する.注、異なるデータベースであれば、多データソースの設定時にデータベースドライバと接続情報を変更することができます.キーコードは以下の通りです.
    3.1ターゲットデータベースの作成MySQLにおいてターゲットデータベースとしてmy_test1を作成し、プロジェクト例のsql/my_test1.sqlを実行してユーザテーブルを作成し、単純化するために、ターゲットデータテーブルはソースデータテーブルデータテーブル構造と同じである.作成後は以下の通りです
    3.2マルチデータソースの設定
    ここに来て、私達のプログラムは三つのデータベースに関連しています.それぞれ:
  • によるSpring Batchのデータ格納のためのmy_spring_batch
  • である.
  • ソースデータベースmytest
  • ターゲットデータベースmy_test1
  • したがって、まず多データソースを構成する必要があり、構成方法は前と同じで、propertiesファイルのデータベース接続情報と注釈を用いて構成すれば良い.以下のとおりですapplication.properties
    # spring batch db
    spring.datasource.jdbc-url=jdbc:mysql://localhost:3310/my_spring_batch?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&useSSL=false
    spring.datasource.username=root
    spring.datasource.password=111111
    # origin db
    spring.origin-datasource.jdbc-url=jdbc:mysql://localhost:3310/mytest?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&useSSL=false
    spring.origin-datasource.username=root
    spring.origin-datasource.password=111111
    # target db
    spring.target-datasource.jdbc-url=jdbc:mysql://localhost:3310/my_test1?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&useSSL=false
    spring.target-datasource.username=root
    spring.target-datasource.password=111111
    
    その後、注釈を用いて多データソースを注入し、次のようにする.DataSourceConfig.java
    @Bean("datasource")
    @ConfigurationProperties(prefix="spring.datasource")
    @Primary
    public DataSource batchDatasource() {
        return DataSourceBuilder.create().build();
    }
    
    @Bean("originDatasource")
    @ConfigurationProperties(prefix="spring.origin-datasource")
    public DataSource originDatasource() {
        return DataSourceBuilder.create().build();
    }
    
    @Bean("targetDatasource")
    @ConfigurationProperties(prefix="spring.target-datasource")
    public DataSource targetDatasource() {
        return DataSourceBuilder.create().build();
    }
    
    3.3リードデータコンポーネントを追加するJdbcCursorItemReaderデータベースからデータを読み出して、Spring BatchはコンポーネントJdbcCursorItemReaderを提供して、それによってデータベースのデータを読み出して、エンティティUserにマッピングして、後続の開発のために.作成方法は以下の通りです.
    @Bean
    public ItemReader db2DbItemReader(@Qualifier("originDatasource") DataSource originDatasource) {
        String readSql = " select * from test_user";
        return new JdbcCursorItemReaderBuilder()
                .dataSource(originDatasource).sql(readSql)
                .verifyCursorPosition(false).rowMapper(new UserRowMapper())
                .build();
    }
    
    説明:
  • は、@Qualifier("originDatasource")を使用してソースデータベース
  • を識別する.
  • JdbcCursorItemReaderBuilderは、JdbcCursorItemReader
  • を構築するために用いられる.
  • 読み出しデータのsql文は、実際の状況に応じて作成すればよく、ここではテーブルデータ全体を読み取ることができる.
  • は、データベースをエンティティUserにマッピングし、UserRowMapperを使用して、mapperインターフェースを実現し、データベースから読み出されたRowMapperResultSetのフィールドにマッピングする必要がある.
  • 3.4カスタム処理コンポーネントUserデータを読み出すと、現在の処理はDb2DbItemProcessorフィールドに対し、titleでない場合は大文字にすれば良い.以下のとおりです
    if(Objects.nonNull(title)){
        user.setTitle(title.toUpperCase());
    }
    
    3.5書き込みデータコンポーネントnullを追加する.
    データを書き込み、JdbcBatchItemWriter組み合わせを使用して、JdbcBatchItemWriter文を作成し、エンティティsqlデータをデータベースに挿入すればいいです.
    @Bean
    public ItemWriter db2DbWriter(@Qualifier("targetDatasource") DataSource targetDatasource) {
        String inserSql ="INSERT INTO test_user(id,name,phone,title,email,gender,date_of_birth,sys_create_time,sys_create_user,sys_update_time,sys_update_user) " +
                "VALUES (:id,:name,:phone,:title,:email,:gender,:dateOfBirth,:sysCreateTime,:sysCreateUser,:sysUpdateTime,:sysUpdateUser)";
        return new JdbcBatchItemWriterBuilder()
                .itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>())
                .sql(inserSql)
                .dataSource(targetDatasource)
                .build();
    }
    
    説明:
  • Userを用いてJdbcBatchItemWriterBuilderの作成を行い、データベースに挿入されたsql文を設定し、データソースを指定すれば良い.
  • JdbcBatchItemWriterは、データソース
  • を指定するために使用される.
  • は、@Qualifier("targetDatasource") DataSource datasourceを使用して、読み出されたデータエンティティの属性データを直接にパラメータとしてBeanPropertyItemSqlParameterSourceProvider文に充填することができ、データ挿入動作を実現する.
  • 3.6完全なタスクを組み立てる
    上記の操作により、Java構成を使用して、読み、書き、処理を完全なsqlおよびstepに組み立てることができ、以下に示すように(詳細には工程例ファイルを見ることができる):
    @Bean
    public Job db2DbJob(Step db2DbStep,JobExecutionListener db2DbListener){
        String funcName = Thread.currentThread().getStackTrace()[1].getMethodName();
        return jobBuilderFactory.get(funcName)
                .listener(db2DbListener)
                .flow(db2DbStep)
                .end().build();
    }
    @Bean
    public Step db2DbStep(ItemReader db2DbItemReader ,ItemProcessor db2DbProcessor
            ,ItemWriter db2DbWriter){
        String funcName = Thread.currentThread().getStackTrace()[1].getMethodName();
        return stepBuilderFactory.get(funcName)
                .chunk(10)
                .reader(db2DbItemReader)
                .processor(db2DbProcessor)
                .writer(db2DbWriter)
                .build();
    }
    
    3.7テスト
    前の記事のjobを参考にして、File2DbJobTestファイルを作成すればいいです.以下のとおりです
    @Test
    public void testDb2DbJob() throws JobParametersInvalidException, JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException {
        //  job  
        JobParameters jobParameters = JobUtil.makeJobParameters();
        //  job
        Map stringObjectMap = jobLauncherService.startJob(db2DbJob, jobParameters);
        //    
        Assert.assertEquals(ExitStatus.COMPLETED,stringObjectMap.get(SyncConstants.STR_RETURN_EXITSTATUS));
    }
    
    このテストを経て、ソースデータベースDb2DbJobTest中のmytestテーブルのデータがすべて対象ライブラリtest_user中のmy_test1に同期されていることがわかる.データベースからデータベースへのデータ同期を完了しました.
    4.まとめ
    本論文は簡単な例を通して、ソースデータベースからテーブルデータを読み取り、処理を経てターゲットデータベースに書き込み、特定の汎用性を持つ.Spring Batchをもっと深く理解して実践してほしいです.