Бывают случаи, когда закрытие соединений занимает много времени, например, от 10 минут до 1 часа или еще хуже, даже на неопределенное время, в зависимости от того, насколько тяжелым или медленным был запрос.
В ситуации, когда клиент отменяет запрос, потому что он занимает слишком много времени, я хотел бы как можно скорее освободить используемое базовое соединение.
Я попытался отменить PreparedStatement, закрыть его, затем закрыть набор результатов и, наконец, закрыть соединение. Отмена прошла почти мгновенно. Закрытие PreparedStatement и ResultSet заняло слишком много времени, поэтому мне пришлось обернуть его в Callable с тайм-аутом, чтобы вовремя пропустить этот процесс и продолжить закрытие самого соединения. Мне не повезло, что еще можно попробовать.
Как мне справиться с этим? Я не могу просто оставить соединения незакрытыми и не могу позволить пользователям ждать 10 минут, прежде чем они смогут сделать еще один аналогичный запрос.
Кроме того, что приводит к тому, что закрытие соединения занимает слишком много времени? Есть ли что-нибудь еще, что я мог бы сделать? Как вы думаете, помогут ли подсказки запросов Oracle?
Кстати, я использую Oracle JDBC через драйвер тонкого типа.
ОБНОВИТЬ:
По-видимому, можно принудительно закрыть соединение, настроив свойство TimeToLive в connectionCacheProperties, которое закрывает соединение на определенное время. Тем не менее, то, что мне нужно, по мере необходимости. Это стоит упомянуть, потому что это доказывает, что его можно принудительно закрыть, как это только что сделал пул соединений. На самом деле, я даже получил следующее сообщение в своих журналах.
ORA-01013: user requested cancel..