SQLiteファイルへの同時アクセス過多によるロックについて

このQ&Aのポイント
  • SQLiteのデータベースファイルへの同時アクセス過多によりロックが発生し、データベースへのアクセスが困難となる問題について。
  • SQLiteではトランザクション中にファイル全体がロックされるため、データベースへのアクセスが制限されてしまう。
  • この問題を解決するためには、ファイルを削除してアップロードし直すという応急処置があるが、時間がかかるため適切な対策が必要。
回答を見る
  • ベストアンサー

SQLiteファイルへの同時アクセス過多によるロックについて

PHP5.0+SQLite2.8でユーザー投稿型のサイトを個人運営しています。 1日数万ページビューほどの規模で、 データベースのテーブルのレコード数は数万件、 1レコードあたりのカラム数は数十件ほどあり、 そのテーブルに1日数百件の投稿があります。 それらのデータは随時更新・削除・検索されます。 データベースファイルへのINSERT、UPDATE、DELETE、SELECTなどが重なると 「database is locked」とのエラーメッセージが表示され、 それからもずっとユーザーによるデータベースへのアクセスが続くため、 データベースへのアクセスがしづらい、 もしくはまったくできない状態が延々と続いてしまいます。 SQLiteではトランザクション中にファイル全体がロックされるため こうした現象が発生するようですが、 この状態を元に戻す方法はないのでしょうか? ファイルをいったん削除してアップロードしなおすと直るのですが、 ファイルのアップロードには時間がかかるため、 他にいい応急措置の方法がないものかと悩んでいます。 それから、そもそもこの規模のサイトでデータベースを運用するには SQLiteでは限界があるのでしょうか? 仮に他のデータベースに乗り換えるとしたら、 こうした頻繁に書き込み・更新・削除などが行われるサイトでは どのデータベースを利用すべきでしょうか? それともこの程度の規模であれば、 スクリプトを改善することでSQLiteでも対応可能なレベルでしょうか? なにぶんデータベースに触れて間もないもので知識不足ですが、 どなたか詳しい方にご教授いただければ幸いです。

noname#68791
noname#68791

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

そのような現象を確認したことがないので推測ですが・・・ たぶんSQLiteの限界と思います。 御自身で推測しているように「ファイル全体がロック・・・」は間違っていないと思います。 SQLiteの対極にあると思われるOracleが作業領域自体を複数のファイルで運用する理由のひとつが、このような現象を回避するためと推測できます。 SQLiteは、他のdbでは存在するdbエンジンと呼ばれるサービス( デーモン )が処理するのではなく、SQLite.exe自体が処理を行っているので複数のクライアントからのリクエストが重複した場合の処理が非力だと考えられます。 また、別の原因として考えられるのはWebサーバーのファイル・ロック機能との競合が考えられます。 これは私も経験している問題で、回避策はSQLiteからMySQLへのdb変更でした。 使用しているWebサーバーでは、SQLiteのロック以外に、単純にファイルがロックされる現象が、時々発生し、Webサーバーの管理者からはロック回避手段はないとの回答が来たのでSQLite -> MySQL 以外に選択の余地が無かったのですが、MySQLに変更して以来 db関連のロックされる現象は発生していないので SQLite の限界と理解しています( ファイルのロックは依然として時々発生しているので )。 ただ、別な回避策として、Webサーバーが管理していない領域にdbを設定する方法があるのですが、管理ツールの関係で移動できないので、本当に回避策なるかは確認していないです。  なお、PHPでコーディングされているなら「PDO」でdbを操作していますか? もし、PDOで操作しているならdbへの接続文の1行を変更することでdbを変更できるので、開発はSQLite、実運用はMySQLという開発が可能なのでPDOによる記述をお勧めします。

noname#68791
質問者

お礼

ご回答ありがとうございます。 SQLiteへのリクエストを減らすようスクリプトを改善したところ、 ファイルがロックされてしまう現象はとりあえず回避できていますが、 やはりSQLiteは大規模サイトの運用には向いていないのかもしれませんね。 DB操作にはPDOを用いていますので、 MySQLの使用を検討してみたいと思います。ありがとうございました。

関連するQ&A

  • SQLite vs MySQL

    お世話になります。 データベースにアクセスするperl CGIを造ろうとしています。 1データベース・1テーブルのみの単純なつくりで 1レコードはだいたい、intergerが10項目、char[12]程度のtextが10項目、dateが5項目、 全部で10,000レコード程度の小規模なものです。 ユーザ数は特定の約30人程度です。各人、一日に2~3レコードにしか書き込み操作はしないはずです(時刻は重なるかもしれません)。 速度がクリティカルに要求されるわけではありません。 SQLiteとMySQLの比較は、ネット上でも多数見つかり、多数ユーザならMySQL、single userならSQLiteという感想が多いですが、30人というのが「多数」なのか、どうなのかわかりかねましたので、使用実感をお聞かせください。 SQLiteで少し組んでみたのですが、きわめて容易に作れるし、バックアップも簡単なので、30人程度ならSQLiteでも問題なしということであればSQLiteにしたいところです。

    • ベストアンサー
    • MySQL
  • Access SQLITEのリンクテーブル編集不可

    AccessからSQLITEのリンクテーブル編集不可 Access2010を持っています。ODBC リンクテーブルよりSQLITEのテーブルにリンクテーブルしたいと思っています。 下記のサイトを参考にAccessよりリンクテーブルが作成できました。 http://www.crystal-creation.com/software/tool/office/access/external/sqlite.htm リンクテーブル先のテーブルを開き、データを編集しようと思いましたが、「レコードセットは更新できません」と表示されます。 使用しているのはWindows XP SP3になります。データを編集したいのですが、どのようにすればデータの編集ができるようになるのでしょうか?

  • csvファイルのデータをSQLiteに入力したい

    PHP初心者です。 題のとおり、csvファイルのデータを、サーバー上にあるSQLiteのデータベースのテーブル内に入力したいのですが、PHPでのコードはどのようにすれば良いのでしょうか? ローカルのパソコンでSQLiteテーブルに変換してからアップロードしてもOKかと思い、tksqliteというソフトも試してみましたが、使い方がさっぱり分からず上手くいきませんでした。 どなたかお助けくださいませ。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • Access2000について。

    Access2000にて、複数ユーザーが使用するような システムを作っています。 フォーム上からレコードを削除しようとした場合に、 他のユーザーがそのレコードを編集中 (レコードセレクタがエンピツの状態、テーブルへの 更新はされていない状態)かどうかを 取得して、もし他のユーザーが編集中であれば レコード削除は行わない、というような ことができるのでしょうか? アドバイス 宜しくお願いします。

  • Accessの運用について

    マクロソフトAccess2003でデータベースをネットワーク上で運用しています。データ用のmdbファイルをネットワーク上に置き、クライアントはリンクテーブルを張ったmdbファイルをデスクトップ上において使用しています。 一般的にはスタンドアロンで使用すべきソフトであり、パフォーマンスの低下等の問題が出てきたらアップサイジングが推奨されていると思います。 そこで素朴な疑問が生まれました。 たとえば、Accessデータベースを運用していて3万件のレコードでは問題なく稼動しており5万件を過ぎたあたりでパフォーマンスが低下して使い物にならなくなったとします。 パフォーマンスが低下しないで運用できる確実なレコード数は4万件とします。 そこで、レコードが4万件に達した時点でテーブルを分割します。今までのテーブルを【テーブルA】とし、分割後のテーブルを【テーブルB】とします。 繰り返しになりますが、【テーブルA】が4万件になったらこれを分割して【テーブルB】を設置して各2万件のテーブルとします。 2万件に分ける基準はあるフィールドを基準とし、運用上は検索の第一条件として、この条件決定後にレコードソースを【テーブルA】にするか【テーブルB】にするか決めるようにVBAで指示します。 【テーブルA】か【テーブルB】のどちらかが4万件に達した時点で同様のテーブル分割を行い【テーブルC】、【テーブルD】・・・・・と繰り返していけばレコード数増加によるパフォーマンス低下問題はずっと回避できると思うのですがいかがでしょうか? もちろんAccessは2Gのファイルサイズ制限がありますから、ファイルサイズが影響するパフォーマンス低下と判断すればバックエンドのmdbファイルも分割します。 なにぶんAccessの運用経験1年程度ですので、もしかしたら頓珍漢な発想かなと思い心配です。 ベテランの方々からのアドバイス・ご意見を頂きたいです。 よろしくお願いします。

  • アクセスが重い!!

    アクセス超初心者です。 フィールド数12、レコード数100程度のファイルがあります。非常に少ないレコード数なのですが、ファイルの重さは200MBです。 一体何が原因か分からなかったので、テーブル、クエリなど、中にあったものすべてを削除してみたのですが、ほぼ全くファイルのサイズが変わりません。 他の似たようなファイルでは、レコード数が1000以上あっても2MB程度の重さです。 意味のよく分からない質問だとは思いますが、よろしくお願いいたします。 アクセス2002です

  • Accessでの画像ファイルの取り込み

    お読みいただきありがとうございます。  レコード数200余件のデータベース(商品リスト)の個々のデータに対し、別途準備された画像ファイルを取り込みたいのですが、一括して取り込む方法を教えていただけますでしょうか。  過去の質問を検索して1件同様の質問を見つけたのですが、当方Accessについてはほとんど素人で読んでもよくわかりませんでした。  画像ファイルはJPEGで、ファイル名は通し番号(10.jpgのように)なっていて、それぞれレコード上にある通し番号と1対1で対応しています。Accessは2002です。  宜しくお願いいたします。

  • Android内部のSQLiteデータベースを使う

    Androidアプリ内の既にあるSQLiteデータベースを利用したいのですが、 やり方が分かりません・・。 私が実行したのは、 excelデータ->csvファイルを変換しカンマ区切り,UTF-8変換した上で SQLite3(winコンソール)で .import ファイル名 テーブル名 を実行し実行ファイルを作成しました。 winコンソール上でデータベースにアクセス・文字化け等せずきちんとアクセス、表示することができました。 しかしながら、このデータベースをandroid内のassets?フォルダ内に保持した上で android(のプログラミング上)からオープンし、利用する方法が分かりませんでした・・。 どのようにコーディングすれば 自分で作成したデータベースにアクセスすることができるのでしょうか・・。 SQLiteHelper?というのでアクセス出来るのでしょうか・・。 すみませんがご教授お願いいたします。

  • SQLiteに画像を格納したい

    作りたいと思っているシステムは、テキストと画像をDBに格納し、編集と削除ができるような簡単なデータベースのようなものです。 そこで、DBにはSQLiteを使おうと思っているのですが、調べてみたところSQLiteに画像を格納するのはあまりよくない(できない?ややこしい?)というような記事などを目にしました。 実際のところはどうなのか、ということをお聞きしたいです。 画像はただ単純にサーバーにアップロードするような方法が望ましいのでしょうか。 どなたかご返答頂ければと思います。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • SQLiteとファイルキャッシュではどちらが高速か?

    現在、SQLiteとPHPのキャッシュ(Cache_Liteなど)をともに使っているのですが、 どちらも使えそうな場合、どちらを使うか 迷いながら長い間使っています。 そこで、以下のような場合どちらを使うのがおすすめか 意見をお願いしたく思います。 SQLiteでいえば ID content 1 比較的長い文章1.. 2 比較的長い文章2.. 3 比較的長い文章3.. ..... キャッシュ(ファイル)であれば ファイル名:1 内容:比較的長い文章1.. ファイル名:2 内容:比較的長い文章2.. ファイル名:3 内容:比較的長い文章3.. ..... のようなものです。 SQLiteの場合、インデックスはIDにあり、検索時(SELECT時のWHEREなど)も 文章(content)の方で行うことはなく、IDでSELECTして取り出すのみです。 さらに、この [比較的長い文章..] は更新されたり、レコードorファイルごと削除される可能性があるとします。 このとき、データ数が数千数万~と膨大になるとき、 直近・将来的にどちらが遅くなる、あるいは不便になる(壊れるなど) ことがありうるでしょうか。 なお、こういうものは「一般的にどっちの方が良いとはいえない、場合によるものだ」ということは重々承知しておりますが、その上で おすすめや使い分けがありましたら、あるいは速度的な情報がありましたら、ぜひよろしくお願いいたします。