データベース接続に Tomcat jdbc-pool を使用するJavaバックエンドのWebアプリがあります。これは正常に機能します。
ただし、他の場所にエクスポートする前に確実に実行しようとしています。最近、誰かがSQL Serverデータベースサービスを再起動したが、Tomcatサービスを再起動しなかったというシナリオが発生しました。これによりSQLExceptionが発生しました:Java.sql.SQLException: I/O Error: Connection reset by peer: socket write error
Tomcatを再起動し、jdbc-poolデータソースを強制的に再接続するまで。
Tomcat jdbc-pool docsで何らかの構成を探して、データソースに再接続を試みるように指示しましたが、何も見つかりませんでした。
これに何らかの構成があるかどうか誰かが知っていますか、または各要求の前にこの条件を確認する必要がありますか?
これがあなたの問題であるかどうかは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"
/>
NatanCoxの答えに追加するだけです
参照- 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を使用したい
データベースvalidationQuery notes
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
イングレス-select 1
derby-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"/>
すべてのアプリサーバーの完全な自動接続構成は、ここにあります Datasource autoreconnect in Java Application Servers 。