4.4.5.4.1. Особенности реализации для различных СУБД

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 запросы.