11

DBD::SQLiteによってアクセスされている Perl CGI スクリプト内で SQLite データベースを実行しています。これは、Apache 上でストレート CGI として実行されています。

DBI 接続は正常に機能し、選択を実行できます。ただし、挿入しようとすると、次のエラーでサイコロが表示されます。

DBD::SQLite::st execute failed: unable to open database file(1) at dbdimp.c line 402 at index.cgi line 66

これを修正するために、データベース ファイルのアクセス許可を 666 に変更しようとしましたが、まだエラーが発生します。

何かアドバイス?

4

5 に答える 5

1

SQLite は、挿入と更新を行っているときにファイル全体を一時的にロックします (レコードレベルのロックはありません)。ロックを解放していますか?

SQLite の資料では、トランザクションを開始し、そのトランザクションですべての挿入と更新を定期的に収集してからコミットすることを推奨しています。これにより、多数の連続したファイル ロックが回避され、パフォーマンスが向上します。

于 2009-07-14T00:45:28.120 に答える
1

SQLite はデータベース ファイル全体をロックするため、タイムアウト ベースの再試行メカニズムを使用することをお勧めします。この関連する質問をしたとき、私はほとんど同じ問題に取り組んでいました。

私の場合、サブによってスローされた例外が正規表現と一致する場合に再試行する Mark Fowler's Attemptに似たものを書くことになりました。

qr(already in a transaction|database is locked)i
于 2009-07-14T12:45:43.603 に答える
0

Todd Hunter の回答で説明されているように、ディレクトリ全体に書き込み権限を設定したくない場合は、代わりにjournal_modePRAGMA を「MEMORY」に設定できます。

その場合、次のことに注意してください。

MEMORY ジャーナリング モードでは、ロールバック ジャーナルが揮発性 RAM に保存されます。これにより、ディスク I/O が節約されますが、データベースの安全性と整合性が犠牲になります。MEMORY ジャーナリング モードが設定されているときに SQLite を使用するアプリケーションがトランザクションの途中でクラッシュすると、データベース ファイルが破損する可能性が非常に高くなります。

したがって、これが適切なソリューションであるかどうかは、データベースとその使用方法によって異なります。

他の人はtemp_store プラグマについても言及しています。設定する必要はありませんでしたが、データベースの使用方法に依存する場合があります。

したがって、Perl CGI スクリプトでは、次のように試すことができます。

$dbh->do("PRAGMA journal_mode = MEMORY");
$dbh->do("PRAGMA temp_store   = MEMORY");
于 2019-11-20T19:47:45.293 に答える