
PHP5.0+SQLite2.8でユーザー投稿型のサイトを個人運営しています。
1日数万ページビューほどの規模で、
データベースのテーブルのレコード数は数万件、
1レコードあたりのカラム数は数十件ほどあり、
そのテーブルに1日数百件の投稿があります。
それらのデータは随時更新・削除・検索されます。
データベースファイルへのINSERT、UPDATE、DELETE、SELECTなどが重なると
「database is locked」とのエラーメッセージが表示され、
それからもずっとユーザーによるデータベースへのアクセスが続くため、
データベースへのアクセスがしづらい、
もしくはまったくできない状態が延々と続いてしまいます。
SQLiteではトランザクション中にファイル全体がロックされるため
こうした現象が発生するようですが、
この状態を元に戻す方法はないのでしょうか?
ファイルをいったん削除してアップロードしなおすと直るのですが、
ファイルのアップロードには時間がかかるため、
他にいい応急措置の方法がないものかと悩んでいます。
それから、そもそもこの規模のサイトでデータベースを運用するには
SQLiteでは限界があるのでしょうか?
仮に他のデータベースに乗り換えるとしたら、
こうした頻繁に書き込み・更新・削除などが行われるサイトでは
どのデータベースを利用すべきでしょうか?
それともこの程度の規模であれば、
スクリプトを改善することでSQLiteでも対応可能なレベルでしょうか?
なにぶんデータベースに触れて間もないもので知識不足ですが、
どなたか詳しい方にご教授いただければ幸いです。
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による記述をお勧めします。
ご回答ありがとうございます。
SQLiteへのリクエストを減らすようスクリプトを改善したところ、
ファイルがロックされてしまう現象はとりあえず回避できていますが、
やはりSQLiteは大規模サイトの運用には向いていないのかもしれませんね。
DB操作にはPDOを用いていますので、
MySQLの使用を検討してみたいと思います。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(データベース) IT用語について質問です。 以前ITパスポートの試験を受けた際にデータベースが何の集まりかについての 2 2022/12/10 12:29
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- MySQL 【投稿情報用データベース posts】は必要ないと思います。 1 2022/06/02 21:25
- JavaScript Q&Aの掲示板を作成していてヤフー知恵袋やgoo質問のように質問ごとにURLを生成したい 5 2023/08/04 01:22
- MySQL [1000地域 × 10カテゴリー = 1万件のテーブル]!グループ化? 1 2023/06/14 23:56
- MySQL データベースの複製の仕方(mysql) 2 2023/05/30 18:24
- SQL Server PCが悪くなって新しいPCにSSMSのデータを移すよう頼まれたけど移し方が分からない 1 2023/05/18 16:54
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHP-ACEESか PHP-MySQL-ACCESSか
-
この様なアプリ作成に適したデ...
-
データベースの更新は手動でや...
-
データベースのファイルの本体
-
エクセルVBAでcommit,rollback
-
ACCESS MSDE フォーム上から...
-
SQLiteファイルへの同時アクセ...
-
クラスタ構成について教えて下...
-
キャッシュしたクエリを確認したい
-
ディスク上のサイズの乖離が大...
-
MS-DOSについて
-
SJISのDBは作れますか?
-
pg_restoreでエラー
-
バキュームをクーロンから実行
-
ヤフーショッピングでPayPay支...
-
スキャンディスクをするとメモ...
-
フォーマットについて。
-
エラーについて(更新)
-
ORACLEを仕様目的について
-
fortranで文字列と数値が混在し...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ACCESSのフォームだけを起動す...
-
階層型データベースとVSAM...
-
アクセスで、OLEサーバーも...
-
ACCESSのレコードを削除しても...
-
エクセルVBAでcommit,rollback
-
データベースが開けません
-
SQLのデータベースに韓国語を登...
-
HTMLからのデータベース アクセス
-
WWWでデータベースを作成したい...
-
Accessでは力不足?
-
SQLiteファイルへの同時アクセ...
-
SQLServer7.0上のエラーについて
-
Access2010でリボン等を非表示...
-
C#上でデータベースのコピーを...
-
HP上で商品の検索をしてもら...
-
SQLPlusでUnicode
-
エクセルのデータをアクセスに...
-
Access97のリンクテーブルについて
-
PostgresQLでサーバーを新規追...
-
データーベースがJAVAスク...
おすすめ情報