0

sqlite3を使用する.dllを作成しました。データベースに挿入を実行する挿入機能があります。

また、dllを使用して挿入を実行するテスト実行可能ファイルもあります。現在、sqliteと複数の接続を管理するその機能をテストしています。テストプログラムは無限ループに挿入します。擬似コードは次のようになります。

    while(1) {
      openDb();
      doInsert();
      closeDb();
     }

基本的に、テストアプリの4つのバージョンを実行するように設定し、各バージョンはデータベースに文字(a、b、c、またはd)を挿入します。

現在、データベースはほぼ常にロックされているため、これは機能しません。1つまたは2つで正常に動作しますが、4つのプログラムすべてを実行すると、1つの大きな競合状態を作成するようには機能しません。

私はドキュメントを見て、ここで指定されているSQLITE_OPEN_FULLMUTEXのようなものに出くわしました:http ://www.sqlite.org/c3ref/open.html

sqlite3は、複数のexeが同じDBに一度に書き込もうとしていることに対処するメカニズムを提供しますか?それとも、負荷テストでsqliteを強く押しすぎているのでしょうか?独自の接続プールを作成する必要がありますか?

この問題に関するどんな助けも素晴らしいでしょう。ありがとう。

4

2 に答える 2

2

どの分布を取得するかを気にする場合は、b を追加せずに 10 億の a を追加しないコードを作成する必要があります。あなたは、あなたが望むことをしないコードを書いています。それは sqlite のせいではありません。1,000 個の a を書き、b を書きたくない場合は、そうしないでください。

保証されているのは、データベースが前進することだけです。絶対にやりたくないことをデータベースに要求しないのは、コード次第です。

Sqlite は、できる限り速く、できる限り前進しています。それがその仕事であり、99.99% の確率で、誰もがそれを望んでいます。プロセスの切り替えはコストがかかるため、sqlite はそれを最小限に抑えています。してほしくないことをするように頼まないのはあなたの仕事です。あなたがやりたいことだけをデータベースに要求するようにコードを書いてください。次に、データベースが可能な限り高速に実行されると、必要なものが得られます。

于 2012-08-21T01:47:28.353 に答える
0

ここで指定されたドキュメントで解決策を見つけたと思います:

http://www.sqlite.org/faq.html#q5

誰かが追加するものがある場合、または同じ問題が発生した場合に備えて、この質問を開いたままにします:)

于 2012-08-21T01:39:55.477 に答える