Попытка переподключения источника данных пула 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
Проверяя ту же проблему, я наткнулся на этот пост, в котором есть настройки автоматического подключения для всех серверов приложений.
Ниже приведены настройки, которые я использовал для автоматического подключения в 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.