3

質問: 現在、ASP.net アプリケーション データを XML ファイルに保存しています。

ここでの問題は、非同期操作を行っていることです。つまり、XML ファイルへの同時書き込みアクセスの問題に遭遇しました...

現在、この問題を解決するために組み込みデータベースへの移行を検討しています。現在、SQlite と組み込み可能な Firebird を検討しています。

ただし、SQlite または Firebird が複数の同時書き込みアクセスを処理できるかどうかはわかりません。
そして、私は確かに二度と同じ問題を望んでいません。
誰でも知っていますか?
確かに SQlite の方がよく知られていますが、SQlite と Firebird のどちらが優れていますか? ファイヤーバードと言いがちですが、よくわかりません。

MS-Access や MS-SQL-express の推奨事項はありません。私は正気です。

4

5 に答える 5

7

SQLITE は、ほとんどの状況で同時書き込みを適切に処理するように構成できます。1 つのスレッドまたはプロセスが db への書き込みを開始すると、ファイルがロックされます。2 番目の書き込みが試行され、ロックが発生すると、成功するかタイムアウトになるまで、書き込みを再試行する前に短時間バックオフします。タイムアウトは構成可能ですが、それ以外の場合は、次のように、オプションを有効にする以外にアプリケーション コードが特別なことをしなくてもすべて発生します。

// set SQLite to wait and retry for up to 100ms if database locked
sqlite3_busy_timeout( db, 100 );

以下の 2 つの状況を除いて、これらはすべて非常にうまく機能し、何の問題もありません。

  1. アプリケーションが非常に多くの書き込み (1,000 回の挿入など) をすべて 1 つのトランザクションで行う場合、データベースはかなりの期間ロックされ、書き込みを試みる他のアプリケーションに問題を引き起こす可能性があります。解決策は、このような大規模な書き込みを個別のトランザクションに分割して、他のアプリケーションがデータベースにアクセスできるようにすることです。

  2. データベースが異なるマシンで実行されている異なるプロセスによって共有されている場合、ネットワークにマウントされたディスクを共有します。多くのオペレーティング システムでは、ネットワークにマウントされたディスクにバグがあり、ファイルのロックが信頼できなくなります。これに対する答えはありません。ネットワークにマウントされたディスクでデータベースを共有する必要がある場合は、MySQL などの別のデータベース エンジンが必要です。

私は Firebird の経験がありません。私はこのような状況で、数年にわたって多くのアプリケーションで SQLITE を使用してきました。

于 2010-05-19T17:42:59.183 に答える
6

私は多くの理由で Firebird を選択します。

トランザクションですが、SQLite は同時トランザクションをサポートしていないため、組み込みアプリケーションが 2 つ以上の接続を必要とする場合は、シリアル化する必要があります。組み込みの Firebird データベースは、共有ライブラリを変更するだけで、完全に共有されたデータベースに簡単にアップグレードできます。

これも確認できるかも

于 2010-05-19T17:18:16.780 に答える
2

SQL サポート用の SQLite API を使用して Berkeley DB を調べましたか?

于 2010-11-03T13:00:47.497 に答える
1

SQLiteがぴったりのようです。SQLiteは多くの本番アプリで使用されており、実際には、同時実行の処理に大いに役立つトランザクションをサポートしています。

トランザクションsqlite?C#で

于 2010-05-19T09:56:29.387 に答える
0

上記の ravenspoint のリストに #3 を追加します。たとえば、大規模なコール センターまたは注文処理センターがある場合、たとえば、それぞれが更新または挿入している場合でも、何十人もの人々が同時に [保存] ボタンを押す可能性があります。レコードが 1 つだけの場合、ビジー タイムアウト アプローチを使用すると問題が発生する可能性があります。

シナリオ #3 では、シリアル化できる真の SQL エンジンが理想的です。理想的ではありませんが、共有ファイルのバイト範囲のレコード ロックを実行できる dbms は実用的です。ただし、バイト範囲のレコード ロックでさえ、大量の同時書き込みには不十分であることに注意してください。新しいレコードが、貨物列車の最後の車掌車のようにファイルの最後に追加されると、複数のプロセスが試行されます。同時に、同じバイト範囲にロックを設定します。一方、ハッシュ キー スパース ファイル アプローチ(LAN 用の古い Revelation/OpenInsight データベースなど) と組み合わせたバイト範囲レコード ロック スキームは、このシナリオでは ISAM よりもはるかに優れています。

于 2010-11-03T13:25:08.087 に答える