2016-09-30 17 views
0

私は監視アプリケーションを作成しています。私はすべてのサーバーからクエリを読み込み、sqliteファイルに格納したいと考えています。必要なときはいつでもそれを表示してください。私はC++を使用してこのアプリケーションを作成しています - 複数のサーバーから単一のsqliteデータベースにデータをフェッチして格納する。私は、複数のサーバーからデータをフェッチするために別々のスレッドを使用しています。私はフェッチし、sqliteに直接データを書き込む場合、スレッドの100が同時に書き込みされるようにsqliteファイルをロックすることがあります。 複数のスレッドからsqliteにデータを書き込む最も良い方法は何ですか?複数のスレッドからsqliteにデータを書き込む最良の方法

+1

[The XY solution](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem): 'select'、' epoll'、オーバーラップIOでスレッド数を減らすことを検討してくださいまたはIOマルチプレクサがオペレーティングシステムで最もよくサポートされているものであれば問題ありません。 – user4581301

+0

私の質問を編集しました。私はそれが接続されているサーバーの数に依存スレッド数を減らすことはできません。 –

+1

右ですが、マルチプレクサを使用すると、1つのスレッドで多数のサーバーを管理できます。 – user4581301

答えて

2

同時書き込み操作の数を制御できない場合、sqliteでこれを行うより良い方法はないと思います。

SQLiteは、使用例に合わせて設計されていません。クライアント/サーバーRDBMSへの切り替えを検討してください。これは、SQLiteのは助言するものでもあります。クライアント/サーバーRDBMS月仕事より良い

クライアント/サーバーアプリケーション

https://www.sqlite.org/whentouse.html

状況多くのクライアントプログラムが存在する場合ネットワークを介して同じデータベースにSQLを送信し、 SQLiteの代わりにクライアント/サーバーデータベースエンジンを使用します。 SQLiteはネットワークファイルシステム上で動作しますが、ほとんどのネットワークファイルシステムには の遅延があるため、パフォーマンスは向上しません。 また、多くのネットワークファイルシステムの 実装(UnixとWindowsの両方)ではファイルロックロジックがバグです。ファイルロックで が正しく動作しない場合、2つ以上のクライアントが同じデータベースの同じ部分 を同時に修正しようとすると、破損する可能性があります。 この問題は、基礎となるファイルシステム 実装のバグに起因するため、SQLiteがそれを防ぐために行うことはできません。

実際には、同じデータベースに( アプリケーションサーバーを介さずに)直接アクセスし、多くのコンピュータから同時に ネットワーク経由でSQLiteを使用することは避けてください。

(...)

大量同時

SQLiteは同時に、読者の数に制限をサポートしていますが、それだけで任意の瞬間における1人のライターを許可します。多くの場合、 の状況では、これは問題ではありません。ライターキューアップ。各アプリケーション は、データベースを素早く動かして移動し、 のロックは数十ミリ秒以上持続しません。しかし、いくつかのアプリケーションではより多くの同時実行性を必要とする があり、それらのアプリケーションでは別の解決方法を 求める必要があります。

-1

フラグSQLITE_OPEN_FULLMUTEXが設定されているすべてのスレッドに対して、1つのsqliteデータベース接続のみを使用します。 データベースはすべてのスレッドからの書き込みをシリアル化し、ロックされません。 しかし、データベースとアプリケーションの設計を調整して、クエリーを十分に速く実行する必要があります。

+0

FULLMUTEXは最もロックされており、ロックされていません。また、接続オブジェクトにのみ影響します。接続オブジェクトは、さまざまな理由でスレッド間で決して共有しないでください(各スレッドには独自の接続が必要です)。 –

+0

最後にデータベースの書き込み操作では、常にデッドロックにつながる可能性があるテーブル行やテーブルページのロックがあります。 1つのデータベース・ライター・スレッド/プロセスまたはFULLMUTEXを使用することが常に推奨されます。 さらに洗練されているのは、同じテーブルに書き込むスレッドにはロックが必要であり、スレッドは異なるテーブルに書き込まれないことです。 読み取り操作では、シリアル化の必要はなく、並行して実行できます。 – BJovke

+0

SQLiteは、データベース全体に対して単一のロックを使用します。デッドロックの可能性はありません。また、 'FULLMUTEX'は_connectionオブジェクト_を保護します。これは、トランザクションを使用することができないため、スレッド間で共有されるべきではありません。 –

関連する問題