SQLiteの「database is locked」について

教えて!Ziddyちゃん – SQLiteファイルへの同時アクセス過多によるロックについて

2ちゃんねるのSQLiteのスレッドでもちょっと話題になっていたのでとりあげてみます。私もよくPerl+SQLiteでサイトを構築したので同じような「database is locked」現象に遭遇したことがあります。実際それがSQLiteの限界だと勝手に解釈しておりましたが、過去の話になりますが私の場合はいくつかの対策で問題を回避又は軽減することができたのでそのことをメモしておきます。

私の場合この問題はページ数が多いサイトだとアクセス過多が起きやすかったと思います。原因は検索エンジンのクロールでした。特にグーグル/百度/ヤフー/MSNなどが頻繁にアクセスしてくるのでページ数が多いサイトはどうしてもアクセス過多になってしまうのでした。

対策はrobots.txtでクローラーのアクセスを自分のサイトにあった適切な値に設定することと、行儀の悪いクローラーは.htaccessでブロックなど、これが結構効果がありました。

また、robots.txtはすぐに効果が現れるわけではないのでその間は一時的にアクセスが多いクロールは.htaccessでブロックしたりしました。

追加の対策としてデータベースへのアクセスを減らすためにページを静的化したりキャッシュしたりです。できるだけDBへのアクセスを減らすようにしたほうがいいのは当たり前ですが掲示板の様なサイトではページの静的化は面倒というか非効率的だしブラウザのキャッシュの関係もあり掲示板ユーザが掲示板に投稿した内容が反映されないなどのトラブルに遭いやすいのであまり向いてないとおもいます。

また、キャッシュの場合はページ数が多い場合はディスクスペースとの兼ね合いもあるので色々悩ましかったりします。専用サーバーだと問題ないと思いますけど共用サーバだとキャッシュするのもキャッシュ削除するのもバランスを取るのに工夫が必要です。そういう事をする人は今後はVPSを使うとおもわれますけど。

robots.txtの例

#User-agent: *
#Disallow: /page
#
#User-agent: *
#Disallow: /PAGE

User-agent: twiceler
Crawl-delay: 300

User-agent: msnbot
Crawl-delay: 300

User-agent: bingbot
Crawl-delay: 300

User-agent: baiduspider
Disallow: /

User-agent: BaiduImagespider
Disallow: /

User-agent: BaiduMobaider
Disallow: /

User-agent: Yeti
Disallow: /

User-agent: MJ12bot
Disallow: /

User-agent: Slurp
Crawl-delay: 5000

#User-Agent: Googlebot
#Disallow: /
#
#User-Agent: Googlebot-Mobile
#Disallow: /

(Visited 250 times, 1 visits today)

タグ : ,