フォーチュンサモナーズ
«前の日記(2008-01-09) 最新 次の日記(2008-01-12)» 編集

Don'tStopMusic

2003|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|12|
2006|01|02|03|04|05|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|08|09|10|

カテゴリ別 2003年 | 2004年 | 2005年 | 2006年 | 2007年 | 2008年

知り合いサイト: よんだもの / 暴想 / Linuxでやる夫 / 新宿Vipper / 僕だけが幸せになればいいのに。


2008-01-11

_ [ActiveRecord] SQLite3::BusyException (database is locked) が出た場合 このエントリーを含むブックマーク

答え: 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
Creative Commons License
This work is licensed under a Creative Commons License
(note: text only. w/o web design, citations, (re)distributed softwares).