Попытка повторного подключения источника данных jdbc пула после перезапуска базы данных
У меня есть веб-приложение с back-end Java, которое использует Tomcat jdbc-pool для соединений с базой данных. Это прекрасно работает.
Однако я пытаюсь проверить его до экспорта в другие места, и недавно произошел сценарий, когда кто-то перезапустил службу базы данных SQL Server, но не перезапустил службу Tomcat. Это вызвало SQLException: java.sql.SQLException: I/O Error: Connection reset by peer: socket write error
, пока я не перезапустил Tomcat, заставив источник данных jdbc-pool повторно подключиться.
Я искал какую-то конфигурацию в документах Tomcat jdbc-pool, чтобы сообщить источнику данных попытаться снова подключиться, но я ничего не нашел.
Кто-нибудь знает, есть ли какая-то конфигурация для этого или я должен проверить это условие перед каждым запросом?
Ответы
Ответ 1
Не уверен, что 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"
/>
Ответ 2
Проверяя ту же проблему, я столкнулся с этим сообщением, у которого есть конфигурации автоматического подключения для всех серверов приложений.
Ниже приведена конфигурация, которую я использовал для автоматического подключения в 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.
Ответ 3
Просто добавьте ответ Натан Кокс
Ссылка - http://tomcat.apache.org/tomcat-8.0-doc/jdbc-pool.html#Common_Attributes
<Resource type="javax.sql.DataSource"
...
testOnBorrow="true"
validationQuery="SELECT 1"
removeAbandoned="true"
/>
В отличие от Geronimo, я все равно хотел бы использовать validationQuery
Валидация базы данных Замечания по безопасности
hsqldb - select 1 from INFORMATION_SCHEMA.SYSTEM_USERS
Oracle - select 1 from dual
DB2 - select 1 from sysibm.sysdummy1
mysql - select 1
Microsoft SQL Server - select 1
postgresql - select 1
ingres - select 1
дерби - values 1
H2 - select 1
Firebird - select 1 from rdb$database
Ссылка - DBCP - validationQuery для разных баз данных