postgres 9.2データベースに接続された jndi プールされたデータソースを使用して、glassfish 3.1.2.2で実行されているgrails 2.2.1プロジェクトに取り組んでいます。アプリケーションを初めてデプロイするとき、問題はなく、すべて正常に動作します。
しかし、アプリケーションをアンデプロイ (または再デプロイ) するたびに、接続プールが機能しなくなります。Glassfish 管理コンソールを使用して ping を実行しようとすると、次のエラーが発生します。
Avertissement: RAR8054: Exception while creating an unpooled [test] connection for pool [ sample ],
Connection could not be allocated because: No suitable driver found for
jdbc:postgresql://localhost:5432/sample?loginTimeout=0&socketTimeout=0&prepareThreshold=5&unknownLength=2147483647&loglevel=0&tcpkeepalive=false
Grave: RestResponse.getResponse() donne FAILURE.
endpoint = http://localhost:4848/management/domain/resources/ping-connection-pool.json ; attrs = {id=sample}'
繰り返しますが、接続プールはデプロイ時に正常に動作します (「/glassfish/lib」に postgresql ドライバーがあり、接続プールが正しく構成されているなど)。問題が発生するのはデプロイを解除するときだけです。このバグは非常に再現性が高く、問題を再現する小さな grails プロジェクトも作成しました。glassfish サーバーの「サンプル」データベース (jndi/sample) に接続された jndi データソースを構成するだけで済みます。
ここに github リンクがあります:
https://github.com/fabier/GlassfishJDBCGrailsPostgresql
そして戦争:
https://www.dropbox.com/s/cb9hmgc6lfabl5x/GlassfishJDBCGrailsPostgresql-0.1.war
と domain.xml ファイル:
https:/ /www.dropbox.com/s/ljealpfp0zxj2r4/domain.xml
Grails 側では、プールへの接続は次のように構成されています。
environments {
production {
dataSource {
dbCreate = "create-drop"
jndiName = "jdbc/sample"
}
}
}
他の webapps または ear 間で共有できる接続プールを強制終了するため、このバグは深刻だと思います。情報については、アンデプロイに関連するある種のクラスアンローダーである可能性があることを感知して、少し調査を行いました。この問題にリンクしている可能性のあるlog4jを見つけたので、試しました:
-Dorg.apache.catalina.loader.WebappClassLoader.ENABLE_CLEAR_REFERENCES=false
しかし、それは役に立ちませんでした。
最後のポイント : 実際、postgresql ドライバーは完全にアンロードされているため、postgresql ドライバーを使用する他の接続プールはアンデプロイ後に使用できません。
Grails メーリング リストの同じ問題へのリンク:
http://grails.1312388.n4.nabble.com/Undeploy-on-Glassfish-causes-connection-pool-to-be-no-more-usable-td4643041.html
へのリンクGlassfish の Jira の同じ問題:
http://java.net/jira/browse/GLASSFISH-20094
ご協力いただきありがとうございます。