JPA (и/или Hibernate) — как установить порог тайм-аута для подключения и/или запроса?

Я пытаюсь выяснить, как настроить мой проект так, чтобы JPA отключился по тайм-ауту и ​​выдал исключение по истечении заданного времени. Есть две ситуации, когда я хотел бы, чтобы это произошло:

  • Когда JPA не может даже подключиться к базе данных
  • Когда запрос JPA занимает больше времени, чем пороговое значение тайм-аута, чтобы вернуть набор результатов

Я не уверен, можно ли эти два сценария настроить отдельно (для каждого свой порог тайм-аута) или для обоих используется один порог.

Мой проект в настоящее время настроен следующим образом:

  • Кодирование по спецификации JPA 2.0
  • Использование Hibernate 3.5.6 в качестве реализации JPA
  • Использование пула соединений c3p0 с Hibernate
  • Использование файла конфигурации persistence.xml (с использованием значений свойств, специфичных для Hibernate, только при необходимости)
  • НЕ использовать какие-либо файлы конфигурации Hibernate

person Jim Tough    schedule 05.10.2010    source источник


Ответы (3)


Свойство сохраняемости JPA2 "javax.persistence.query.timeout" позволяет вам установить время ожидания для запроса (при условии, что базовый драйвер JDBC поддерживает его).

person DataNucleus    schedule 05.10.2010
comment
+1 за предупреждение об этом свойстве. К сожалению, он не работает с драйвером Oracle JDBC, который находится в файле ojdbc14.jar. Я пока не могу получить более новый драйвер, потому что проект использует сервер Oracle 10g и какое-то время не будет обновляться. - person Jim Tough; 05.10.2010

Вы должны установить время ожидания по умолчанию как для клиента Java, так и для сервера базы данных: если вы использовали Spring, используйте @Transactional (timeout = 10), который в конечном итоге устанавливает подсказку подготовленногоStatement.setQueryTimeout() для закрытия транзакции в течение 10 секунд. Кроме того, включите тайм-аут вашего сервера немного выше тайм-аута клиента, чтобы «пользователь клиента Java» отключился, скажем, через 15 с: https://mariadb.com/kb/en/mariadb/query-limits-и-timeouts/

person kisna    schedule 31.03.2016
comment
Конечно, для вашего стека с Spring+Hibernate вам придется добавить еще 1 секунду к тайм-ауту, чтобы избежать этой ошибки: hibernate.atlassian.net/browse/HHH-9482 - person kisna; 28.04.2016

На этой странице вики Hibernate подробно описано, как настроить пул соединений c3p0, включая настройки времени ожидания.

Обратите внимание, что данные этого типа на самом деле не имеют ничего общего с JPA или Hibernate, а являются настройками, которые вы устанавливаете для самого соединения DataSource/базы данных (в данном случае c3p0).

person matt b    schedule 05.10.2010
comment
Итак, это, кажется, отвечает на мой вопрос о тайм-ауте соединения, но я до сих пор не понимаю, как установить тайм-аут для запроса. Когда вы говорите DataSource, вы имеете в виду что-то на уровне JDBC? Как мне получить доступ к этому из JPA? - person Jim Tough; 05.10.2010
comment
Поправьте меня, если я ошибаюсь, но C3P0 будет просто объединять соединения, и вам все еще нужно настроить базовый источник данных — это правильно? Если да, то я имею в виду, что вам нужно настроить базовый драйвер JDBC для тайм-аутов, как для установления соединения, так и для отдельных запросов. - person matt b; 05.10.2010
comment
Единственные свойства подключения, которые мне нужно было установить, — это класс драйвера (oracle.jdbc.OracleDriver), URL-адрес подключения (jdbc:oracle:thin:@myhost:1521:ORCL), а также пользователь и пароль. Все это делается с помощью 4 стандартных свойств JPA 2 в файле persistence.xml. Я бы не знал, куда идти, если бы захотел попробовать настроить JDBC. - person Jim Tough; 05.10.2010