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 есть поддержка только для пакетных вставок, а не для обновлений, поэтому вы не должны включать ее.