sqlite[sqlite3][ruby]busy_handlerを使ってみるすっごいいまさらですが、sqlite2(Ruby/DBI)→sqlite3(sqlite-ruby)の移行に着手しています。sqlite2の時は、アクセスが競合してBusyになった時のリトライ処理が見あたらなかったので、自前でこんなことをしていました。@dbh}(DBに接続を試みて、DBI::DatabaseErrorが発生したら、1秒sleepしたあとリトライ、10回試みて、それでも駄目だったらDBI::DatabaseErrorをraiseします。)Rubyらしいエレガントなコード♪とか思っていたのですが、プログラムのあちこちにこれが散見される状態というのもなんだか悲しい。sqlite-rubyでは、busy_handlerという機能が実装され、こういう事はライブラリ内でやってくれるようになりました。これのサンプルが見あたらない。あれこれ試行錯誤していちおう動くようになったのですが、なんだか謎の部分も残っているので、ご存じの方、教えていただけると嬉しいです。片方のシェルで、sqlite3を走らせて、ロック状態にしておきます。12:59:15");(sqlite2の頃は、BEGIN;した時点でロックされていたのですが、今のバージョンでは、実際にロックが必要になった時点でロックするみたいです)もう片方でirbを走らせて、こんな感じでロックに激突させます。`check':よしよし。BUSYだった時の処理}という具合にして宣言する。このコードはすぐ実行されるわけではなく、DBにアクセスしてBUSYだった時に初めて実行される。retriesに試行回数が入っている。(謎)busy_timeoutの挙動が謎。APIリファレンスを見ると、busy_timeout(1000)ってしたら、一秒おきにリトライしそうな物ですが、実際には丸無視しているように見えますしょうがないので、busy_handler内でsleepします(謎)dataって何でしょうね?busy_handlerのブロックの評価結果がtrueであれば、リトライが実施されます。falseであれば、例外が投げられます。書くわけじゃなくて、ブロックの評価結果が使われるところがポイントかと。上のサンプルでは、3回まではリトライして、それで駄目なら例外を投げるようなコードになっています。sqlite2件のコメント[sqlite]sqliteで文字列結合メモ。sqliteでconcat、つまり文字列の結合をやりたい時は、”||”をつかう。ThemeCountry。