Как использовать 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 пытается не делать никаких предположений о реализации и предоставляет исполнителя, который может использоваться, если реализация нуждается в этом.

Другие вопросы по тегам