Как использовать Java.sql.Connection.setNetworkTimeout?
Я столкнулся с точной проблемой, которую setNetworkTimeout должен решить в соответствии с Oracle. Запрос застрял в socket.read() на несколько минут.
Но я понятия не имею, каким должен быть первый параметр для этого метода. Отправка нулевого значения вызывает исключение AbstractMethodError, так что... нужна ли реализации какой-то пул потоков только для того, чтобы установить время ожидания сети?
Есть ли способ достичь того же эффекта без запуска пула потоков только для этого одного условия?
1 ответ
Кажется, что документация объясняет это ужасно, но, не глядя на какой-либо код позади класса, я думаю, что вы должны передать экземпляр Executor методу, чтобы реализации могли порождать задания / потоки для проверки состояния связь.
Поскольку чтение соединения блокируется, для реализации любой логики тайм-аута необходим другой поток, помимо чтения, который может проверять состояние соединения.
Похоже, было принято решение о том, что вместо того, чтобы драйвер JDBC реализовывал внутреннюю логику, а именно, как / когда порождать потоки для обработки этого, API хочет, чтобы вы как клиент передали Executor, который будет использоваться для проверки тайм-ауты. Таким образом, вы, как клиент, можете контролировать такие вещи, как частоту выполнения проверки, предотвращая появление в вашем контейнере большего количества потоков, чем вам нравится, и т. Д.
Если у вас еще нет экземпляра Executor, вы можете просто создать экземпляр по умолчанию:
conn.setNetworkTimeout(Executors.newFixedThreadPool(numThreads), yourTimeout);
Что касается драйвера Postgres JDBC (postgresql-42.2.2.jar), реализация setNetworkTimeout не использует параметр Executor. Он просто устанавливает указанное время ожидания в качестве времени ожидания основного сокета, используя метод Socket.setSoTimeout.
Похоже, что интерфейс java.sql.Connection пытается не делать никаких предположений о реализации и предоставляет исполнителя, который может использоваться, если реализация нуждается в этом.