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