Перенос данных с использованием приложения Springboot занимает слишком много времени - PullRequest
0 голосов
/ 02 марта 2020

Я создал приложение командной строки в java, используя springboot, который переносит данные из 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);
    }
}

Я сохраняю каждого пользователя, используя транзакционный , потому что я хочу выполнить откат, если какой-либо из userAddressEntity или userDetailsEntity не может быть сохранен

У меня есть 70K записей в базе данных oracle , Один метод oracleUserRepository.findAll () занял около 40 минут , чтобы загрузить все сущности и сохранить сущности в mysql БД занимает еще больше времени.

Это правильный способ сделать это? Есть ли способ улучшить производительность в этом?

Ответы [ 3 ]

0 голосов
/ 02 марта 2020

70К не должно быть проблемой. Попробуйте прочитать каждую строку и вставить в mysql вместо того, чтобы найти все в памяти. Когда вы делаете каждый подход строки, удалите Transactional, который может вызвать небольшую медлительность. В случае сбоя зарегистрируйте исключение и повторите или исправьте данные, если возникли проблемы с данными и выполните их повторно.

0 голосов
/ 02 марта 2020

Это не будет очень эффективным, но метод .findall не должен занимать 40 минут для загрузки 70k записей ... Если, конечно, ваш find all просто пытается вернуть каждую строку и не перегружен с ограничением выбора и исходная таблица огромна, и ваш выбор находится на неиндексированном столбце. Вы уверены, что у вас нет ресурсов, связанных с вашим Java процессом или Oracle сервером? Ваша куча JVM достаточно велика?

Если вы подключаетесь к базе данных с помощью sqlplus и запускаете команду select, чтобы найти все из своей пользовательской таблицы, сколько времени это займет? Если это тоже медленно, у вас есть какой-то ресурс / конфликт / блокировка на уровне базы данных ... Если он быстро реагирует, но вашей программе требуется 40 минут, чтобы получить результат, вам нужно проверить свою JVM .. это связано с ресурсом? et c

0 голосов
/ 02 марта 2020

JPA имеет пакетную функциональность для повышения производительности.

Однако этот вариант использования кажется идеальным для решения сценариев, так что можно полностью контролировать операторы и транзакции SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...