Я исправил некоторую ошибку, связанную с тем, как мы использовали BasicDataSource, и хотя я понимаю ее часть, у меня остались некоторые вопросы без ответа:)
Проблема: Приложение не смоглоавтоматическое подключение к базе данных после сбоя БД.
Приложение использует org.apache.commons.dbcp.BasicDataSource class в качестве пула TCP-соединений для соединения JDBC с Oracle db.
Исправление: После некоторых исследований я обнаружил, что в BasicDataSource не были установлены testOnBorrow и testOnreturn.Я предоставил запрос проверки для проверки соединений.Это устранило проблему
Максимальное количество соединений в пуле не было установлено в 1
Мое понимание: Пул соединений передаст соединение с приложением.Я думаю, что происходило то, что приложение MAGICALLY вернуло плохую коллекцию в пул при сбое базы данных.Теперь, поскольку Пул не знает, является ли это плохое соединение, он передаст то же самое соединение приложению в следующий раз, когда это потребуется, в результате чего приложение не будет автоматически повторно подключаться к БД.
Теперь, после исправления.. всякий раз, когда плохое соединение возвращается в пул соединений, оно будет отброшено и больше не будет использоваться из-за исправления, которое я сделал выше.
Теперь я знаю, что BasicDataSource оборачивает соединение перед передачей приложению, так что всякий раз, когда приложение говорит con.close ..BasicDataSource будет знать, что соединение больше не используется .. оно позаботится о любом возвратесоединение с пулом или удаление и т. д.
неотвеченный вопрос: Однако я не понимаю, что заставляет приложение ВОЛШЕБНО возвращать соединение в пул соединений, когдаон сломан [Обратите внимание, что метод con.close не вызывается, когда соединение завершается незаметно].BasicDataSource не может знать, что соединение закрыто или существует?Может ли кто-нибудь указать мне код для этого?
Я понимаю, что я понял, почему исправление сработало ??