10

かなり明白な何かが欠けていると確信していますが、データベースがロックされているというエラーで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 回未満になりました。他のスクリプトでデータを読み取るときに、データを書き込む時間が数秒ずれていることを確認することで、さらに先に進むことができると思いますが、基本的には、問題を回避して、タイムアウトを必要としないようにしています。まだ正しくないようです。タ。

4

4 に答える 4

6

pysqlite の初期のバージョンでは、timeoutパラメーター tosqlite.connectは明らかにミリ秒として解釈されます。だからあなたはそうtimeout=30.0あるべきですtimeout=30000

于 2010-09-07T13:56:26.920 に答える
1

SQLite は、大量の書き込みワークロード向けに最適化されておらず、そのふりもしていません (ただし、1 つのトランザクションで大量の書き込みを行うことは問題ありません)。MySQL、PostgreSQL、Oracle、DB2 などの別のデータベースに切り替える必要が生じているように思えます。これらのオプションの中には確かに高価なものもありますが、一部のワークロードではそれが必要です。(また、書き込み負荷の高いワークロードは、専用のデータベース サーバー ソリューションを使用した方が適切な傾向にあることにも注意してください。これにより、展開のコストと複雑さが押し上げられます。コストがかかるものもあります。)

于 2010-05-12T21:08:08.067 に答える
0

SQLite uses database locking for every write (update/insert/delete/...). IMHO, this lock is held until transaction ends. This is single lock held across threads/processes, AFAIK.

So, I'd try explicitly ending both transaction and connection for writing script and to explicitly commit even in reading script and try to debug concurrency issues.

于 2010-04-08T09:51:06.363 に答える