Исключение гибернации JPA EntityManager "отсоединенная сущность передана для сохранения" из-за ошибки тайм-аута
Я поддерживаю приложение, которое часто сохраняет огромное количество данных в базу данных во время постоянной операции. Приложение работает без проблем при меньшем количестве данных. Но когда я пытаюсь сохранить огромный объем данных, через 30 минут он выдает исключение гибернации "отсоединенная сущность, переданная для сохранения"
Я искал различные объяснения этому и обнаружил, что это может происходить в основном по двум причинам:
- Неправильно написанный код / неправильно определенная сущность
- Объект отсоединяется после определенного времени ожидания
Я уверен, что это не проблема кода, так как приложение работало без проблем для меньшего количества данных.
Предполагая, что это проблема тайм-аута, я не уверен, где определен тайм-аут и какой именно тайм-аут определяет, когда объект должен быть отсоединен.
Любая помощь будет оценена. Мы используем Hibernate, Seam и JBoss 7 для запуска приложения
2 ответа
После долгих проб и ошибок я обнаружил, что это можно изменить, изменив default-timeout среды-координатора в standalone.xml, как показано ниже:
<subsystem xmlns="urn:jboss:domain:transactions:1.3"> <core-environment> <process-id> <uuid/> </process-id> </core-environment> <recovery-environment socket-binding="txn-recovery-environment" status-socket-binding="txn-status-manager"/> <coordinator-environment default-timeout="300"/> </subsystem>
Если вы используете контекст управляемой персистентности шва (так называемый SMPC), тогда менеджер сущностей (и, следовательно, сеанс гибернации), вероятно, будет храниться в контексте диалога, поэтому время ожидания, вероятно, является контекстом разговора, это можно откорректировать в файле component.xml с помощью следующие...
<core:manager conversation-id-parameter="cid" conversation-timeout="3600000" />
Установить в миллисекундах