1

JettyでJRubyonRailsアプリケーションを実行していますが、起動前にステージングサーバーに到達したため、JDBC接続が放棄されるという問題が突然発生しました。これが説明するための素敵なスタックトレースです:

サーバーに送信された最後のパケットは12ミリ秒前でした。

スタックトレース:

com.mysql.jdbc.CommunicationsException:根本的な例外による通信リンクの障害:

**ネストされた例外を開始します**

java.io.EOFException

スタックトレース:

com.mysql.jdbc.MysqlIO.checkErrorPacket(com.mysql.jdbc.MysqlIO.checkErrorPacket( MysqlIO.java:2803)

私の理解を読んでみると、MySQLは非アクティブのために一定期間接続プールを強制終了していることがわかります(これは、現在、ステージングの負荷が非常に軽いため、理にかなっています)。次のgemを使用してJRuby1.3.1で実行されています。

activerecord-jdbc-adapter(0.9.1)activerecord-jdbcmysql-adapter(0.9.1)jdbc-mysql(5.0.4)

接続が維持されるか、適切にリサイクルされるようにするには、おそらく何らかの方法でJDBC構成を設定する必要があると思いますが、どこを見ればよいかを見つけるための支援が必要です。誰かが私に詳細を提供できますか?

ありがとう、スティーブ

4

2 に答える 2

1

RailsまたはActiveRecord-JDBCコードのいずれかが、定期的な接続pingまたはアイドル時間のティアダウンを提供するはずです。サーバーによってカリングされる接続は、接続プールの実装で処理できる標準的なケースです。

kenai.comでActiveRecord-JDBCにバグを報告すると思いますが、最初にJRuby MLで、これに対する確実な解決策を見つけた人がいないか尋ねてください。

于 2009-10-13T15:00:55.797 に答える
1

これはおそらくwait_timeoutの設定が原因です。これを非常に大きくすることもできますが、それはデータベース サーバーに対する管理アクセス権があることを前提としています。

JRuby や Rails は使ったことがありません。しかし、「通常の」Java では、これを解決する方法は、アイドル状態の接続を自動的にリサイクルする接続プールを使用することです。たとえば、c3p0にはこれを制御するmaxIdleTime設定があります。

EDIT : 楽しみのために、「activerecord idle connection」で Google 検索を行ったところ、いくつかヒットしました。ここに 1 つ: http://groups.google.com/group/sinatrarb/browse_thread/thread/54138bfedac59849

どうやらあなたが使用できると呼ばれる方法がありActiveRecord::Base.verify_active_connections!ます。私はこの解決策について一切保証しません:-)。IANARP (私は Ruby プログラマーではありません)。

于 2009-10-08T20:56:05.380 に答える