2016-08-16 3 views
6

Я использую JPA 2.1, Oracle DB и имею список идентификаторов для объектов, подлежащих удалению (около 430000 идентификаторов). Сначала он был реализован как разделение этого списка идентификаторов на каждый меньший с 1000 идентификаторами, передачу их в качестве параметров для JPQL и выполнение.JPA CriteriaDelete с огромными параметрами

delete from SOPFilter f where f.id in (?1)

Тогда, я хочу изменить, чтобы использовать JPA CriteriaDelete.

CriteriaDelete<SOPFilter> criteriaDelete = cb.createCriteriaDelete(SOPFilter.class); 
Root<SOPFilter> from = criteriaDelete.from(SOPFilter.class); 
criteriaDelete.where(from.get(SOPFilter_.id).in(sopFilterIds)); 

Он работает прекрасно, пока он не достигнет 90000th один и есть исключение времени выполнения причиной его остановить здесь

org.hibernate.SessionException: Сессия закрыта

и сделать заведующий фабрикой предприятий.

INFO: bernate.impl.StmpContainerEntityManagerFactoryBean: Закрытие JPA EntityManagerFactory для сохранения состояния блока 'IMOFFERINGMANAGEMENT'

Для кого был введен в заблуждение мой первый пост с этим исключением

java.lang. IllegalStateException: EntityManagerFactory закрыт

Был улов cl ause для обработки исключения времени выполнения, добавляя запись в базу данных, прежде чем бросать ее. И чтобы добавить запись о событии, она пытается создать еще один сундук из фабрики, который теперь закрыт.

public static void logEvent(EntityManager em) { 
    EntityManager em2 = null; 
    EntityManagerFactory emFactory = em.getEntityManagerFactory(); 
    em2 = emFactory.createEntityManager(); 
    // ... 
} 

Может ли кто-нибудь пролить свет на него?

+1

Дают еще некоторые детали, как вы используете JPA CriteriaDelete. Также по вашему вопросу у вас появилось около 43000 идентификаторов и исключение, когда управление достигло 90000-й строки? это 9000-я строка, которую вы имеете в виду? –

+0

Как можно закрыть ЭМП? часть блока finally и какое-то исключение было брошено? гадание - это все, что люди могут сделать здесь с этой информацией. –

+0

Странно ли, что я прочитал название в голосе Дональда Трампа? – shmosel

ответ

0

Im не ясно, на ваш код, но вы, вероятно, ударяете о тайм-ауте транзакции. Вы можете установить подсказку -

query.setHint("javax.persistence.query.timeout", 8000); 

Там также может быть таймауты стороны базы данных

+0

После добавления дополнительных протоколов я получаю реальное исключение, которое заставляет EMF закрываться. org.hibernate.SessionException: сеанс закрыт. Это долго работающая операция, поэтому я думаю, возможно, она связана с таймаутом, как вы упомянули. – pirent

+0

что было исключением? – farrellmr

+0

да звучит как тайм-аут – farrellmr

Смежные вопросы