PostgreSQL
К сожалению, JDBC драйвер PostgreSQL не поддерживает метод setQueryTimeout()
интерфейса java.sql.Statement
, поэтому в начале каждой транзакции, для которой определен таймаут (любым способом, включая ненулевое значение свойства
cuba.defaultQueryTimeoutSec
), выполняется дополнительный оператор в БД: set local statement_timeout to {value}
. При этом в случае превышения таймаута запрос будет прерван самим сервером БД.
Для снижения нагрузки от этих дополнительных операторов рекомендуется поступать следующим образом:
-
Таймаут по умолчанию устанавливать не на Middleware с помощью свойства cuba.defaultQueryTimeoutSec, а на самом сервере PostgreSQL в файле
postgresql.conf
, например,statement_timeout = 3000
(это в миллисекундах). -
Для методов, которым требуется большее время таймаута (отчеты и пр.), явно указывать желаемый таймаут в параметрах транзакции.
Microsoft SQL Server
Драйвер JTDS поддерживает метод setQueryTimeout()
интерфейса java.sql.Statement
, поэтому для EntityManager
просто устанавливается стандартное свойство javax.persistence.query.timeout
, которое соответствующим образом влияет на JDBC запросы.