1

環境-Grails2.0.4、Oracle 11G

数時間非アクティブになった後、データベースから読み取ると、java.net.SocketException:接続がタイムアウトしました。この問題を解決するための他の提案に基づいて、db接続を維持するためのプロパティでdataSourceを更新します。これが私が見たいくつかの解決策です-

1つの解決策
別の解決策

解決策には、データソースに適切な値を設定することが含まれているようです。私の場合、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で指定された期待値がありました。まだソケット例外が発生する理由はありますか?

4

1 に答える 1

0

問題を理解しました。脳死の開発者。修正をチェックインするのを怠ったため、ビルド環境によって作成された戦争にはなりませんでした。Datasource.groovy をチェックインすると、すべてが groovy で、今朝はタイムアウト例外が表示されませんでした。上記の解決策は機能します。

validationQuery の実行時になぜデバッグ メッセージが表示されなかったのか、まだ混乱しています。ログに validationQuery を表示するための適切な log4j エントリを知っている人はいますか?

于 2012-08-03T13:36:42.950 に答える