5

私の Android アプリケーションでは、異なるスレッドから複数の SQLite テーブルにデータを挿入する必要があります (1 つのテーブルに挿入するための 1 つのスレッドで、5 つのテーブルがあります)。多くのデータがあるので、すべてのスレッドでbeginTransaction()-> setTransactionSuccessful()->を使用endTransaction();し、すべてのスレッドが同時に開始されますが、2 番目または 3 番目のスレッドでは常にこの例外が発生します。

ここに画像の説明を入力

ここで述べたように、単一の SQLite 接続 (シングルトン) を使用していますが、それでもこの問題は残っています。

PSそして、競合状態がある場合、マルチスレッド挿入に他にどのような方法を使用すればよいですか?

4

1 に答える 1

9

あなたの問題は競合状態だと思います。トランザクションを開始および終了する複数のスレッドがあるため、次のような操作が行われる可能性があります。

beginTransaction()
// this may be a noop because a transaction is already open
beginTransaction()
setTransactionSuccessful()
setTransactionSuccessful()
endTransaction()
// this may throw because the previous end closes the transaction
endTransaction()

Sqliteが単一の接続で開いている複数のトランザクションをサポートしているとは思いません。ご指摘のとおり、複数の接続は不可能です。

トランザクションの目的がデータの高速化である場合は、アーキテクチャを変更する必要があり、複数のスレッドから書き込む必要はありません。ある種のユーティリティ クラスを使用して、実際のデータベースの更新を行うことができます。synchronizedこれにより、すべてのスレッドが呼び出され、トランザクションを開くか閉じるかが決定されます。もう 1 つのアイデアは、1 つのスレッドでデータベース操作を実行し、他のすべてのスレッドが書き込みBlockingQueueスレッドと共有される に書き込むというものです。

于 2013-04-18T17:44:16.613 に答える