Hatena::Grouprubyist

たばさの RSSフィード

10/19(金) 2012

sqlite3 busy_handler retryはどうするの

sqlite3 busy_handler retryはどうするの - たばさの を含むブックマーク はてなブックマーク - sqlite3 busy_handler retryはどうするの - たばさの

handlerあるんだあと使ってみたら仕様が変わっていたようなのでメモ。


 lock

dbh=SQLite3::Database.new(filename)
dbh.execute("BEGIN IMMEDIATE")
sleep 10000

 handler登録

dbh=SQLite3::Database.new(filename)
dbh.busy_handler{|data, retries|
  print "in busy_handler data is ",data,"\n"
  print "retries is ",retries,"\n"
  res=(retries<=3)
  if res
    sleep 10
    retries+=1
  else
    retries=0
  end
  retries
}
dbh.execute("insert into ...") # nadonado

=>

in busy_handler data is nil
retries is 0
in busy_handler data is nil
retries is 1
in busy_handler data is nil
retries is 2
in busy_handler data is nil
retries is 3
in busy_handler data is nil
retries is 4
database is locked

クラス内で使ってみると、callbackがいくつも登録されてるというエラー。はて。

複製してるつもりはないんですが。代入で複製されるんだっけ?ということで

class Sql
  def initialize
    @dbh=SQLite3::Database.new("sql.db")
    #ハンドラー登録
  end
end

変更後

class Sql
  @@dbh=SQLite3::Database.new("sql.db")
  #ハンドラー登録
  def initialize
  end
end

エラーが消えたのでとりあえず解決。

(追記:代入じゃなかった、なんどかループでSql.newよびだしていただけだった)

参考

http://blog.mogya.com/2009/04/sqlite3rubybusy-handler.html

http://www.nishi2002.com/sqlite/x.php?cate=sql&id=41

トラックバック - http://rubyist.g.hatena.ne.jp/hatecha/20121019
カレンダー
<< 2012/10 >>
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
archive Error : RSSが取得できませんでした。