Попытка переподключения источника данных пула jdbc после перезапуска базы данных

У меня есть веб-приложение с Java- сервером, которое использует Tomcat jdbc-pool для соединений с базой данных. Это отлично работает.

Однако я пытаюсь обезопасить его перед экспортом в другие места, и недавно произошел сценарий, когда кто-то перезапускал службу базы данных SQL Server, но не перезапускал службу Tomcat. Это вызвало исключение SQLException: java.sql.SQLException: I/O Error: Connection reset by peer: socket write error пока я не перезапустил Tomcat, принудительно переустанавливая источник данных jdbc-pool.

Я искал какую-то конфигурацию в документах jcat-пула Tomcat, чтобы указать источнику данных попытаться восстановить соединение, но я ничего не смог найти.

Кто-нибудь знает, есть ли какая-то конфигурация для этого, или я должен проверять это условие перед каждым запросом?

3 ответа

Решение

Не уверен на 100%, если это ваша проблема, но на http://www.tomcatexpert.com/blog/2010/04/01/configuring-jdbc-pool-high-concurrency говорится, что вы можете использовать testOnBorrow с validationQuery,

<Resource type="javax.sql.DataSource"
            ...
            testOnBorrow="true"
            validationQuery="SELECT 1"
            removeAbandoned="true"
            />

Просто чтобы добавить к ответу Натана Кокса

Ссылка - http://tomcat.apache.org/tomcat-8.0-doc/jdbc-pool.html

<Resource type="javax.sql.DataSource"
        ...
        testOnBorrow="true"
        validationQuery="SELECT 1"
        removeAbandoned="true"
        />

В отличие от Geronimo, я все еще хотел бы использовать validationQuery

Проверка базы данных

hsqldb - select 1 from INFORMATION_SCHEMA.SYSTEM_USERS

Оракул - select 1 from dual

DB2 - select 1 from sysibm.sysdummy1

mysql - select 1

Microsoft SQL Server - select 1

postgresql - select 1

Ингрес - select 1

дерби - values 1

H2 - select 1

Жар-птица - select 1 from rdb$database

Ссылка - DBCP - validationQuery для разных баз данных

Проверяя ту же проблему, я наткнулся на этот пост, в котором есть настройки автоматического подключения для всех серверов приложений.

Ниже приведены настройки, которые я использовал для автоматического подключения в tomcat для справки.

    <Resource auth="Container"
driverClassName="oracle.jdbc.OracleDriver"
initialSize="5"
maxActive="120"
maxIdle="5"
maxWait="5000"
name="jdbc/oracle/myds"
password="secret"
poolPreparedStatements="true"
type="javax.sql.DataSource"
url="jdbc:oracle:thin:@DBHOSTNAME:1521/ServiceName"
username="testuser"
validationQuery="select 1 from tab"
testOnBorrow="true"/>

Полные конфигурации автоматического подключения для всех серверов приложений можно найти здесь в разделе " Автоматическое подключение источника данных" на серверах приложений Java.

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