カテゴリ別 2003年 | 2004年 | 2005年 | 2006年 | 2007年 | 2008年
知り合いサイト: よんだもの / 暴想 / Linuxでやる夫 / 新宿Vipper / 僕だけが幸せになればいいのに。
答え: timeout 設定を忘れてないか確認。
ActiveRecord で sqlite3 をデータベースに使っていて、複数のプロセスから同時に書き込み(insert, update, delete)が発生すると、後から書き込もうとしたプロセスは例外を投げます。
例えば複数のバッチ処理が動く場合、時間が重なることはしばしばありますので、例外で止まられても困ります。
これはデータベース設定に timeout を指定すれば回避できます。busy だった場合には、例外を上げるまで timeout ミリ秒だけ待ってくれるようになります。長時間ロックするクエリが重なれば結局 BusyException になりますが、SQLite を適用するようなデータベースであればたぶん大丈夫でしょう(適当)。database.yml では以下のように設定します。
hoge:
adapter: sqlite3
dbfile: hoge.sqlite3
timeout: 10000
rails コマンドで作成された database.yml は timeout: 5000 (5秒)がデフォルトで設定されますので、気にしてなくても回避されていることが多いと思います。
私はバッチ処理などの非 rails プログラムから ActiveRecord を使うことが多いので、データベース設定は手書き……MySQL から移行したプログラムが SQLite3::BusyException 連発したので調べたところ、timeout 設定が抜けていることがわかりました。
最近のコメント:
RSS
![]()
This work is licensed under a
Creative Commons License
(note: text only. w/o web design, citations, (re)distributed softwares).