Sponsored Link
トップ «前の日記(2007年04月14日(土)) 最新 次の日記(2007年04月22日(日))» 編集  RDF

メモの日々

2000|11|12|
2001|01|02|03|04|05|06|07|08|09|10|11|12|
2002|01|02|03|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|

2007年04月16日(月) [長年日記]

  • 夜眠れない。
  • MySQLは色々面倒だな。

[ruby][db] 「MySQL server has gone away」エラー一応解決

土曜日に未解決だった「MySQL server has gone away」エラーが出る件で何が起こっているのか少しわかったのでメモ。

今作っているRailsアプリケーションには、forkする変な処理がある。forkした後で子プロセスが終了するとMySQLとの接続が閉じられ、そうすると親プロセスがDBを参照しようとしたときに件のエラーが発生することがあるみたい。

こんな風にしてエラーが起こっているように見える:

railsプロセス
     |
     +-- fork --> 子プロセスA
(waitしない)          |
     |                +-- fork --> 子プロセスB
     |              (wait)             |
     |                :             exec失敗
     |            子プロセスA          x
DBへアクセス      の終了を検出
するとエラー          |
     |            DBへアクセス
     |            するとエラー
     |                x

子プロセスBの終了時にMySQLとの接続がクローズし、その後railsプロセスや子プロセスAはそのクローズした接続を使ってDBにアクセスしようとするからエラーになるのではないかと思う。

で、子プロセス終了時にexit!を呼び出すようにしたらエラーは出なくなった。exit! って安直に使っても大丈夫なんだろうか。リソースリークが起こるような気もする。fork じゃなくてスレッドを使うように直した方がいいのかなあ。

[ruby-list:43021] Open3に似たような話があって、参考にした。

(追記)

直ってなかったみたい。まだエラーになることがある。

ActiveRecord::Base.remove_connection()ActiveRecord::Base.establish_connection()というメソッドがあったので、fork()した後でこれらを呼び出してDBとの接続をリセットするようにしたら改善された気がする。これで直るといいけど。

やること

  • 年金
  • スポンジ
  • 歯ブラシ
[]

トップ «前の日記(2007年04月14日(土)) 最新 次の日記(2007年04月22日(日))»