- ベストアンサー
SQLiteファイルへの同時アクセス過多によるロックについて
- SQLiteのデータベースファイルへの同時アクセス過多によりロックが発生し、データベースへのアクセスが困難となる問題について。
- SQLiteではトランザクション中にファイル全体がロックされるため、データベースへのアクセスが制限されてしまう。
- この問題を解決するためには、ファイルを削除してアップロードし直すという応急処置があるが、時間がかかるため適切な対策が必要。
- みんなの回答 (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による記述をお勧めします。
お礼
ご回答ありがとうございます。 SQLiteへのリクエストを減らすようスクリプトを改善したところ、 ファイルがロックされてしまう現象はとりあえず回避できていますが、 やはりSQLiteは大規模サイトの運用には向いていないのかもしれませんね。 DB操作にはPDOを用いていますので、 MySQLの使用を検討してみたいと思います。ありがとうございました。