私は監視アプリケーションを作成しています。私はすべてのサーバーからクエリを読み込み、sqliteファイルに格納したいと考えています。必要なときはいつでもそれを表示してください。私はC++を使用してこのアプリケーションを作成しています - 複数のサーバーから単一のsqliteデータベースにデータをフェッチして格納する。私は、複数のサーバーからデータをフェッチするために別々のスレッドを使用しています。私はフェッチし、sqliteに直接データを書き込む場合、スレッドの100が同時に書き込みされるようにsqliteファイルをロックすることがあります。 複数のスレッドからsqliteにデータを書き込む最も良い方法は何ですか?複数のスレッドからsqliteにデータを書き込む最良の方法
答えて
同時書き込み操作の数を制御できない場合、sqliteでこれを行うより良い方法はないと思います。
SQLiteは、使用例に合わせて設計されていません。クライアント/サーバーRDBMSへの切り替えを検討してください。これは、SQLiteのは助言するものでもあります。クライアント/サーバーRDBMS月仕事より良い
クライアント/サーバーアプリケーション
https://www.sqlite.org/whentouse.html
状況多くのクライアントプログラムが存在する場合ネットワークを介して同じデータベースにSQLを送信し、 SQLiteの代わりにクライアント/サーバーデータベースエンジンを使用します。 SQLiteはネットワークファイルシステム上で動作しますが、ほとんどのネットワークファイルシステムには の遅延があるため、パフォーマンスは向上しません。 また、多くのネットワークファイルシステムの 実装(UnixとWindowsの両方)ではファイルロックロジックがバグです。ファイルロックで が正しく動作しない場合、2つ以上のクライアントが同じデータベースの同じ部分 を同時に修正しようとすると、破損する可能性があります。 この問題は、基礎となるファイルシステム 実装のバグに起因するため、SQLiteがそれを防ぐために行うことはできません。
実際には、同じデータベースに( アプリケーションサーバーを介さずに)直接アクセスし、多くのコンピュータから同時に ネットワーク経由でSQLiteを使用することは避けてください。
(...)
大量同時
SQLiteは同時に、読者の数に制限をサポートしていますが、それだけで任意の瞬間における1人のライターを許可します。多くの場合、 の状況では、これは問題ではありません。ライターキューアップ。各アプリケーション は、データベースを素早く動かして移動し、 のロックは数十ミリ秒以上持続しません。しかし、いくつかのアプリケーションではより多くの同時実行性を必要とする があり、それらのアプリケーションでは別の解決方法を 求める必要があります。
フラグSQLITE_OPEN_FULLMUTEXが設定されているすべてのスレッドに対して、1つのsqliteデータベース接続のみを使用します。 データベースはすべてのスレッドからの書き込みをシリアル化し、ロックされません。 しかし、データベースとアプリケーションの設計を調整して、クエリーを十分に速く実行する必要があります。
FULLMUTEXは最もロックされており、ロックされていません。また、接続オブジェクトにのみ影響します。接続オブジェクトは、さまざまな理由でスレッド間で決して共有しないでください(各スレッドには独自の接続が必要です)。 –
最後にデータベースの書き込み操作では、常にデッドロックにつながる可能性があるテーブル行やテーブルページのロックがあります。 1つのデータベース・ライター・スレッド/プロセスまたはFULLMUTEXを使用することが常に推奨されます。 さらに洗練されているのは、同じテーブルに書き込むスレッドにはロックが必要であり、スレッドは異なるテーブルに書き込まれないことです。 読み取り操作では、シリアル化の必要はなく、並行して実行できます。 – BJovke
SQLiteは、データベース全体に対して単一のロックを使用します。デッドロックの可能性はありません。また、 'FULLMUTEX'は_connectionオブジェクト_を保護します。これは、トランザクションを使用することができないため、スレッド間で共有されるべきではありません。 –
- 1. マルチスレッド:重複したデータを書き込むときの最良の方法
- 2. パイプラインでsqliteにデータを書き込むときにsqlite db curとconを閉じる最も良い方法
- 3. Javaの複数のスレッドからFileOutputStreamに書き込む
- 4. 複数のスレッドからTraceListenerに書き込む
- 5. ディレクトリ内の複数のファイルにデータを書き込む方法
- 6. 複数のスレッドで複数のファイルを書き込む方法は?
- 7. NSXMLElementに任意のNSDataを書き込む最良の方法
- 8. バイナリファイルにbyte []を書き込む最良の方法
- 9. SQLデータベースのソースからMongoDBに書き込む最良の方法は?
- 10. PowerShellのコンソールに書き込む最も良い方法
- 11. SQLite - SQLiteデータベースからデータを読み込む最速の方法は?
- 12. 異なるUserControlからログファイルを書き込む最良の方法
- 13. イメージにテキストを書き込む最も良い方法は?
- 14. 複数のスレッドで書き込みファイルを読み込む
- 15. 複数のスレッドで1つのファイルに書き込む方法は?
- 16. Java mvcからスレッドに書き込む
- 17. 同じファイルに複数のスレッドを書き込む
- 18. Java:オブジェクトデータメンバーをファイルに書き込む最良の方法は何ですか?
- 19. 複数のスレッドからランダムな順序でファイルに書き込む
- 20. 複数のスレッドからAzureデータレイクにストリーミングデータを書き込む方法はありますか?
- 21. 複数のスレッドが同じブール値に書き込む
- 22. 複数スレッドのクロニクルキューに書き込む - > java.nio.BufferOverflowException
- 23. 複数の値をテキストファイルの1行に書き込む方法
- 24. Javaで複数のスレッドを書き込む
- 25. Python pandas excelの配列からデータを書き込む方法
- 26. iphoneアプリケーションからWebサーバーにデータを書き込む方法は?
- 27. NightmareJSからファイルにデータを書き込む方法
- 28. golang配列からinfluxdbにデータを書き込む方法は?
- 29. PysparkからElasticsearchにデータを書き込む方法は?
- 30. DataGridviewからXMLにデータを書き込む方法
[The XY solution](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem): 'select'、' epoll'、オーバーラップIOでスレッド数を減らすことを検討してくださいまたはIOマルチプレクサがオペレーティングシステムで最もよくサポートされているものであれば問題ありません。 – user4581301
私の質問を編集しました。私はそれが接続されているサーバーの数に依存スレッド数を減らすことはできません。 –
右ですが、マルチプレクサを使用すると、1つのスレッドで多数のサーバーを管理できます。 – user4581301