Как автоматически повторно подключить пул соединений Oracle после прерывания соединения?

Я столкнулся с проблемой объединения пулов Oracle через OracleConnectionCacheImpl. Когда я подключаюсь к пулу подключений на моем сервере базы данных (Oracle 10g) через тонкий драйвер, все работает нормально, пока после неопределенного времени соединение db не будет удалено (возможно, из-за неудачных соединений?), И я получаю сообщение об ошибке:

Закрытое соединение.

Обновление страницы и повторная попытка подключения повторно соединяют базу данных, поэтому она не кажется проблемой для сети или базы данных. Является ли способ пула соединений Oracle проверять его соединение и повторно подключаться, если соединение в пуле по какой-либо причине мертво?

Я использую Apache Tomcat 6.0.18, обновление для Java EE6 11.

(Кажется, в тонком драйвере Oracle есть функция ping. Помогает ли это и где я могу ее найти?)

Ответ 1

Apache DBCP (пул соединений DB) поможет здесь. Вы можете настроить с помощью параметра "validationQuery", который является SQL-запросом для запуска в соединении, удаленном из пула, прежде чем он вам его предоставит. Если запрос завершился неудачно, соединение будет отброшено, а новое будет сделано и предоставлено вам.

Подробнее см. http://commons.apache.org/proper/commons-dbcp/configuration.html.

Обратите внимание, что validationQuery будет вызываться каждый раз, когда вы получаете соединение из пула, поэтому оно должно быть как можно быстрее. например:

SELECT id FROM users LIMIT 1;

Ответ 2

Вы можете добавить некоторые параметры конфигурации в context.xml, чтобы пул соединений tomcat позаботился о мертвых соединениях. Вот один пример context.xml, пожалуйста, используйте пользователь/пароль/url/ports и т.д. В соответствии с вашими настройками.

<?xml version="1.0" encoding="UTF-8"?>
<Context path="">
    <!-- Specify a JDBC data source -->
    <Resource name="jdbc/db" auth="Container"
              type="javax.sql.DataSource"
              username="user"
              password="password"
              driverClassName="driver.class.fullpath"
              url="jdbc:oracle://localhost:3306/
              maxActive="50"
              maxIdle="10"
              testOnBorrow="true"
              testWhileIdle="true"
              validationQuery="/* ping */"
              removeAbandoned="true"
              logAbandoned="true"/>
</Context>

Ответ 3

Используйте другую библиотеку пула соединений, такую ​​как C3P0, и используйте эту функцию для автоматического повторно подключиться.