2016-09-20 10 views
0

私は共通データベース上で動作する必要のある一連のプログラムを、おそらく同時に作成しています。わかりやすくするために(ユーザーのために)、私はデータベースサーバーのセットアップを必要としたくありませんでした。したがって、私はバークレーDBに定住しました。バークレーDBは、プログラムを起動して、存在しない場合はDBを作成させることができます。Berkeley DBトランザクション処理の使用上の問題

プログラムをデータベース上で同時に動作させるには、5.xリリースに存在するトランザクション機能を使用する必要があります(ここでは、python3-bsddb3 6.1.0-1 + b2とlibdb5.3 5.3.28を使用します)。 -12):ドキュメンテーションは、それが実行可能であることを明確に示している。しかし、私はすぐにも、いくつかの基本的な作業で、トラブルに走っ:

  • プログラム1は
  • プログラム2は、以前にプログラム1で追加されたレコードをスキャンして、追加のデータとそれらを更新しているテーブル内のレコードを初期化します。

物事をスピードアップするために、追加データが言ったのインデックスがあります。プログラム1がレコードを作成すると、追加データは存在しないので、そのレコードへのポインタは空のキーの下のインデックスに追加されます。プログラム2は、まだ更新されていないレコードをただちに探すことができます。

同時に実行しない場合でも、記録更新プログラムはいくつかの更新後にクラッシュします。最初に、ミューテックスエリアのスペースが不十分であると訴えました。私はあいまいなDB_CONFIGファイルでこれを解決し、db_recoverを実行しなければなりませんでした。

次に、いくつかのアップデートの後、再び 'メモリを割り当てることができません - BDB3017はバッファキャッシュから領域を割り当てることができません'。 db_recoverを実行してプログラムを再起動するとそのトリックが実行されましたが、それは後で同じエラーが発生した後に再びクラッシュする可能性があります。

は私も同時使用に言及していないよ。他の実行中のプログラムの一つが起動したとき、彼らはほぼ瞬時に破損したセグメントについて、デッドロックとパニックをクラッシュし、復旧を実行するように依頼します。私は多くの変更を加えましたので、検索の際に無関係な一致を頻繁に出すさまざまなエラーを経験しました。私はlmdbを使用するためにdbコールを書き直しました。実際にはうまく動作していて、実際には速くて、私のプログラムロジックに誤りがないことを示す傾向があります。残念ながら、lmdbによって生成されたデータファイルはまれであり、すぐに容認できないサイズに成長しました。

私が言ったことから、多分いくつかのリソースがどこかにリークされているようです。私はこの問題をPythonバインディングから得ることができるかどうかを確認するために、C言語で直接これをすべて書き直すことを躊躇しています。

私は、私はコードで質問を更新しますすることができますが、一瞬のために、TIは十分な長さです。私はBDBでトランザクションのものを使用している人を探しています。同様の用途のために、いくつかの問題を指摘できます。

おかげ

答えて

0

RPM(http://rpm5.orgを参照)トランザクション・モードでのBerkeley DBを使用しています。あなたがしようとしていることに応じて、かなりの数の落とし穴があります。

あなたはすでにDB_CONFIGを発見した:あなたはミューテックスとロックのサイズを設定する必要があり、デフォルトは常に小さすぎます。

開発中にdb_recoverを実行する必要があるため、非常に苦痛です。最善の修正(imho)は、DB_RUNRECOVERYの戻りコードをチェックして開き、DB_RECOVERを指定してdbenvを再度開いて、リカバリを自動化することです。

デッドロックは通常デザイン/コーディングエラーです。デッドロック(またはロックが保持されているもの)を確認してプログラムを調整するには、db_stat -CAを実行します。 "lmdvでの作業"は作業コードを要求するのに十分ではありません;-)

リークは、-fsanitize:addressを指定したvalgrindコンパイルまたはBDBコンパイルで確認できます。オーバーライドを使用したり、BDBをコンパイルして初期化したりしない限り、valgrindはfalseの初期化を報告しません。

関連する問題