Я хотел бы установить тайм-аут на javax.persistence.TypedQuery.Установить таймаут в TypedQuery с JPA2
Я нашел простой способ:
TypedQuery<Foo> query = ... ;
query.setHint("javax.persistence.query.timeout", 1000);
query.getReturnList();
Но мне кажется, что не работает, это просто игнорируется.
С PRO JPA 2 книга:
«К сожалению, установка тайм-аут запроса не является переносимым поведение Это может не поддерживаться всеми платформами баз данных и не является требованием быть. поддерживаемых всеми поставщиками персистентности. Поэтому заявки , которые хотят включить таймауты запроса, должны быть подготовлены для трех сценариев .
Во-первых, свойство игнорируется и игнорируется не имеет никакого эффекта.
Второе, что свойство включено, и любой выбор, обновление, или операции удаления, которая работает дольше, чем указанное значение тайм-аута прервана, и QueryTimeoutException брошено. Это исключение может быть обработано и не будет вызывать маркировку активной транзакции для отката .
Третий сценарий состоит в том, что свойство включено, но при этом база данных заставляет откат транзакции при превышении таймаута . В этом случае будет выбрано значение PersistenceException и транзакция , отмеченная для отката. В общем случае, если включена приложение должно быть написано, чтобы справиться с QueryTimeoutException, но не должна потерпеть неудачу, если тайм-аут превышен, и исключение не выброшены.»
Кто-нибудь знает любой другой метод, чтобы указать Тайм-аут на TypedQuery
Или как я могу сделать это "намек" работает
Thanks
EDIT:? Oracle 11.2.0.4.0 и P ostgreSql 9.2.9 с JPA 2.1/Hibernate
Простой поиск Postgresql показывает, что они могут не реализовывать JDBC setTimeout в своем драйвере JDBC, см. Https://stackoverflow.com/questions/1175173/jdbc-postgres-query-with-a-timeout с обходным решением if вы можете получить соединение JDBC, которое Hibernate использует –
. После этого отчета (https://hibernate.atlassian.net/browse/HHH-4662) Hibernate должен поддерживать его с версии 3.5. Есть глобальная настройка в файле persistence.xml. – SubOptimal
Тайм-аут может быть проигнорирован, если вы указали значение менее половины секунды. Хотя JPA требует тайм-аута в миллисекундах, он округляется до секунд для 'java.sql.Statement # setQueryTimeout (int seconds)' – user2418306