使用springboot应用程序进行数据迁移会花费太多时间

问题描述 投票:0回答:3

我使用springboot在Java中创建了一个命令行应用程序,该程序将数据从oracle数据库迁移到mysql数据库

我正在服务级别中进行关注

@Service
public class MyService{

    @Autowired
    public OracleUserRepository oracleUserRepository;

    @Autowired
    public OracleUserAddressRepository oracleUserAddressRepository;

    @Autowired
    public OracleUserDetailsRepository oracleUserDetailsRepository;

    @Autowired
    public MysqlUserRepository mysqlUserRepository;

    @Autowired
    public MysqlUserAddressRepository mysqlUserAddressRepository;

    @Autowired
    public MysqlUserDetailsRepository mysqlUserDetailsRepository;

    public void migrateData(){
        List<OracleUserEntity> oracelUserEntities=oracleUserRepository.findAll();
        for (OracleUserEntiy oracleUserEntity: oracleUserEntities){
            migrateEntity(oracleUserEntity);
        }
    }

    @Transactional("mysqlTransactionManager")
    public void migrateEntity(OracleUserEntity oracleUserEntity){

        OracleUserAddressEntity oracleUserAddressEntity=getAddressEntity(oracleUserEntity);
        OracleUserDetailsEntity oracleUserDetailsEntity=getDetailsEntity(oracleDetaislEntity);


        MysqlUserEntity mysqlUserEntity=convertToMysqlUserEntity(oracleUserEntity);
        mysqlUserRepository.save(mysqlUserEntity);

        MysqlUserAddressEntity mysqlUserAddressEntity=convertToMysqlAddressEntity(oracleUserAddressEntity);
        mysqlUserAddressRepository.save(mysqlUserAddressEntity);

        MysqlUserDetailsEntity mysqlUSerDetailsEntity=convertToMysqlUserDetailsEntity(oracleUserDetailsEntity);
        mysqlUserDetailsRepository.save(mysqlUserAddressEntity);
    }
}

我正在使用transactional保存每个用户,因为如果userAddressEntity或userDetailsEntity中的任何一个保存失败,我想回滚

我在oracle数据库中有70K个条目。 oracleUserRepository.findAll()方法仅花费了大约[[40分钟来加载所有实体,并将实体保存到mysql DB会花费更多时间。

这是正确的方法吗?无论如何,有什么可以提高性能的吗?
spring spring-boot spring-data-jpa database-migration
3个回答
0
投票
但是,此用例似乎是脚本解决方案的理想选择,因此可以完全控制SQL语句和事务。

0
投票

0
投票
© www.soinside.com 2019 - 2024. All rights reserved.