EclipseLink, JPA, Mysql отключить автокоммит

У меня проблемы с MySQL, получая каждую строку, когда я делаю entityManager.persist();

Я пробовал с

JPAConnect.em.setFlushMode(FlushModeType.COMMIT);

Без удачи.

Или есть способ зафиксировать List<> без необходимости циклически проходить по каждой строке?

jpac.beginTransaction();

        for (BuyLateStrategyEntity buyLateEntity : buyLateList) {
            stockName = buyLateEntity.getStockName();

            freader.readRawData(stockName, buyLateEntity.getTradeDate());


            //persist() done here.
            runningTotal *= findSalePrice(buyLateEntity.getClosePrice());

            System.out.println("Running total: " + runningTotal + " At Date: " + 
            buyLateEntity.getTradeDate() + " Instrument: " + buyLateEntity.getStockName());
        }
        jpac.commitTransaction();

1 ответ

Решение

Если вы хотите, чтобы строки попадали в вашу БД в определенном порядке, единственный способ решить это сброс. Просто прочитайте документацию FlushModeType здесь, и вы поймете, что это на самом деле влияет на время сброса в сочетании с выполнением запроса, а не в сочетании с другими persist() звонки.

Если вы просто хотите, чтобы строки попадали в БД в каком-то определенном порядке, я бы просто назвал em.persist()/merge() для каждой строки (которая в вашем коде отсутствует), но flush() ОДИН РАЗ перед фиксацией (хотя сброс происходит автоматически при фиксации транзакции).

Но если ваша идея состояла в том, чтобы очистить каждую строку: вы пытаетесь решить правильную проблему: зачем вам нужно промывать в for цикл? Может быть, вам просто нужен параметр сортировки (JPA может сделать это для вас, если этот список является полем в другом объекте)? Имейте в виду, что даже если вы очищаете запись, результат не будет виден другим транзакциям, пока вы не совершите фиксацию (учитывая разумную изоляцию транзакции и механизм хранения, который поддерживает транзакции, такие как InnoDB).


ОБНОВЛЕНИЕ (после того, как вы дали понять, что вы хотите как можно меньше общения с вашей БД)

Вы уже делаете все возможное, совершая (поэтому сбрасывая) только один раз. Как примечание: в EclipseLink есть поддержка Batch Write, которую вы можете включить, если ваша БД поддерживает это. Проблема в том, что в MySQL есть поддержка только для пакетных вставок, а не для обновлений, поэтому вы не должны включать ее.

Другие вопросы по тегам