2014-12-18 2 views
0

Я хотел бы установить тайм-аут на 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

+1

Простой поиск Postgresql показывает, что они могут не реализовывать JDBC setTimeout в своем драйвере JDBC, см. Https://stackoverflow.com/questions/1175173/jdbc-postgres-query-with-a-timeout с обходным решением if вы можете получить соединение JDBC, которое Hibernate использует –

+0

. После этого отчета (https://hibernate.atlassian.net/browse/HHH-4662) Hibernate должен поддерживать его с версии 3.5. Есть глобальная настройка в файле persistence.xml. – SubOptimal

+0

Тайм-аут может быть проигнорирован, если вы указали значение менее половины секунды. Хотя JPA требует тайм-аута в миллисекундах, он округляется до секунд для 'java.sql.Statement # setQueryTimeout (int seconds)' – user2418306

ответ

4

Я знаю, что его поздно, чтобы ответить, но мы столкнулись с Похожая проблема Oracle 11g, JPA2.0 и эта подсказка не работает.

На самом деле проблема заключалась в том, что мы использовали его как подсказку @NamedQuery и вызывали функцию внутри аспекта @transactional. Поскольку @NamedQuery загружается и компилируется во время загрузки контекста, этот таймаут был переопределен таймаутом транзакции. Дополнительную информацию можно найти на странице http://javadeveloperz0ne.blogspot.in/2015/07/why-jpa-hints-on-namedquery-wont-work.html.

Решение должно снова запрашивать именованный запрос, а затем применять таймаут.

Query query = entityManager.createNamedQuery("NamedQueryName"); 
query.setHint("org.hibernate.timeout", "5"); 
query.getSingleResult(); 

Надеюсь, это поможет!

0

Да, Hint игнорируется, и его не работает, пожалуйста, просмотрите этот вопрос. Вы должны установить тайм-аут для javax.persistence.query.timeout

Set timeout on EntityManager query

+0

Что вы сказали ??? – Gaetano

+0

нажмите «Установить тайм-аут в запросе EntityManager». – jdev

+0

нет ничего интересного в этой ссылке .... – Gaetano