環境-Grails2.0.4、Oracle 11G
数時間非アクティブになった後、データベースから読み取ると、java.net.SocketException:接続がタイムアウトしました。この問題を解決するための他の提案に基づいて、db接続を維持するためのプロパティでdataSourceを更新します。これが私が見たいくつかの解決策です-
解決策には、データソースに適切な値を設定することが含まれているようです。私の場合、2つのデータソースが関係しています。接続のタイムアウトを回避するために、セッションのキープアライブを実行しようとしています。これは、validationQueryプロパティとtestXXXプロパティを設定することで実現できるようです。テストが必要な場合、検証クエリが実行されます。以下の構成で望ましい結果が得られると思いましたが、まだタイムアウトが発生しています。デバッグを開始しました
debug 'org.hibernate'
debug 'jdbc.sqlonly'
私はvalidationQueryが一定の間隔で実行されるのを見ることを期待していました。指定された「6000」ミリ秒の値に基づいて、6秒ごとにvalidationQueryが表示されると予想しました。データソースの仕様は次のとおりです。私はこれを2つの方法で試しました。「プロパティ」クロージャー内でそれらを指定し、「プール」と同じレベルでそれらを指定します。
dataSource_secondary {
logSql = true
pooled = true
properties {
maxActive = 5
maxIdle = 5
minIdle = 3
initialSize = 5
minEvictableIdleTimeMillis = 6000
timeBetweenEvictionRunsMillis = 6000
maxWait = 1000
testOnBorrow = true
testWhileIdle = true
testOnReturn = false
validationQuery = "select 1 from dual"
}
}
また、これをデバッガーで実行し、コンテキストを取得するためにBootStrap.groovyにコードを追加しました。
def ctx = servletContext.getAttribute(ApplicationAttributes.APPLICATION_CONTEXT)
println 'Added a println allowing me to set a break point and inspect the context.'
「ctx」には、dataSource_secondaryで指定された期待値がありました。まだソケット例外が発生する理由はありますか?