2016-07-28 18 views
1

私は、単一のデータベースにアクセスする複数のスレッドを持つマルチスレッドQtアプリケーションを使用しています。各スレッドでSELECT/INSERT/UPDATEを実行するために、別々のQSqlDatabase接続を作成する必要がありますか?以下のガイドラインは、上記のアプローチを落胆されている場合はQtのドキュメントから複数のQtスレッドで1つのQSqlDatabase接続を使用する

が、私は理解することができません私は提案:

を「接続は、それを作成したスレッドの中から使用することができます間の の移動の接続。異なるスレッドの からのスレッドの作成やクエリの作成はサポートされていません。

私は実質的に私の複数のQThreadsで同じ接続を使用してみましたが、すべてが実質的に正常に動作しますが、その正確な事はやっている場合を理解したかったです。私は複数のスレッドで同じ接続名を使用したいhttps://www.sqlite.org/threadsafe.html

理由:FYI、私は デフォルトでシリアル化されたモードをサポートして理解(Qtsql APIを使用して)Qtの中からsqlite3のを使用しています

複数のスレッドで同じデータベースに異なる接続を使用しようとしたときにSELECT/INSERT/UPDATEを実行したため、私はdatabase lockedの問題が頻繁に発生しています。しかし、複数のスレッドで同じ接続を使用する場合、この問題は完全に排除されました。

親切に同じガイド。

よろしく、

Saurabhガンジー

+0

多分、挿入/更新/削除するスロットを持つラッパークラスを作成し、独自のスレッド – Zaiborg

答えて

2

ドキュメントは単にそれを落胆されていないが、それはきっぱりとあなたが(強調鉱山)それをしてはならないと述べている:

接続のみ可能それを作成したスレッド内から使用されます

いいえ、複数のスレッドから1つの接続を使用することはできません。それはうまくいくかもしれませんが、動作することは保証されていません。未定義の振る舞いを呼び出すことになります。どちらもクラッシュすることは保証されていません。

あなたがいずれかを行う必要があります。ロックがデータベースまで、クエリが、ブロックを拒否しないように

  1. は変更に接続パラメータをエンドのデータベースへのアクセスを直列、または

  2. 利用可能になる。私は実際に複数の接続を使用している場合は、エラーコード(私はそれがSQLite_LOCKEDであると推測している)を見るべきではないということを確信しています:database locked "問題" Sqlite 3は、複数のスレッドから簡単に使用できます。マルチスレッドを有効にし、別々の接続を使用する以外には、あなたの目的には何も努力する必要はありません。

関連する問題