かなり明白な何かが欠けていると確信していますが、データベースがロックされているというエラーでpysqliteスクリプトがクラッシュするのを止めることはできません。データベースにデータをロードするスクリプトと、データを読み取るスクリプトの 2 つがありますが、どちらのスクリプトも、他のスクリプトがデータベースに対して何を行っているかによって、頻繁かつ即座にクラッシュします。両方のスクリプトのタイムアウトを 30 秒に設定しました。
cx = sqlite.connect("database.sql", timeout=30.0)
Curses 形式の出力画面の途中に時折ダンプされるタイミング スタンプ (たとえば、0.12343827e-06 0.1 - どうすればそれを停止できますか?) のように見えるものを取得することで、タイムアウトの証拠を確認できると思います。 、しかし、30秒のタイムアウトにリモートで近づく遅延はありませんが、それでも他の1つがこれから何度もクラッシュし続けます。64 ビット 4 CPU HS21 IBM ブレードでRHEL 5.4 を実行していますが、マルチスレッドに関する問題について言及されているのを聞いたことがありますが、これが関連するかどうかはわかりません。使用中のパッケージは sqlite-3.3.6-5 および python-sqlite-1.1.7-1.2.1 であり、Red Hat の公式規定以外で新しいバージョンにアップグレードすることは、私にとって良い選択肢ではありません。可能ですが、一般的な環境のため望ましくありません。
以前は両方のスクリプトで使用していautocommit=1
ましたが、その後両方で無効にしました。現在cx.commit()
、挿入スクリプトを使用しており、選択スクリプトをコミットしていません。最終的に、実際に変更を加えるスクリプトは 1 つしかないため、このロックが発生する理由がよくわかりません。データベースが大きくなるにつれて、これが大幅に悪化することに気付きました。最近では、3 つの同じサイズのテーブルで 13 MB になりました。これは約 1 日分のデータに相当します。新しいファイルを作成すると、これが大幅に改善されました。これは理解できるようですが、最終的にはタイムアウトが守られていないようです。
どんなポインタでも大歓迎です。
編集: 質問以来、コードを少し再構築し、シグナルを使用して、5 秒ごとに 1 つのトランザクションで 0 ~ 150 の更新を定期的に書き込むことができました。これにより、ロックの発生が大幅に減少し、1 分に 1 回程度ではなく、1 時間に 1 回未満になりました。他のスクリプトでデータを読み取るときに、データを書き込む時間が数秒ずれていることを確認することで、さらに先に進むことができると思いますが、基本的には、問題を回避して、タイムアウトを必要としないようにしています。まだ正しくないようです。タ。