0

重複したデータをsqliteファイルに保持しないように複数のテーブルを使用する必要があるプロジェクトがあります(複数のテーブルの使用は悪夢であることがわかっていましたが)。

私のアプリケーションでは、ある方法で1つのテーブルからデータを読み取り、別の方法で別のテーブルにデータを挿入しています。私がこれを行うとき、私はsqliteステップ関数から得ています、sqliteの誤用であるエラーコード21。

私の研究によると、それは私がマルチスレッドからテーブルに到達できなかったためでした。

これまで、sqliteのWebサイトを読んで、sqliteデータベースを構成するための3つのモードがあることを学びました。

1)シングルスレッド:複数のスレッドを呼び出す機会はありません。
2)マルチスレッド:ええマルチスレッド; しかし、いくつかの障害があります。
3)シリアル化:これはマルチスレッドデータベースアプリケーションとの最適な一致です。

trueを返す場合sqlite3_threadsafe() == 2 は、yes sqliteデータベースがシリアル化され、これがtrueを返すので、自分で証明しました。

次に、sqliteデータベースをシリアル化して保証対象にするように構成するコードがあります。

sqlite3_config(SQLITE_CONFIG_SERIALIZED);

1つのテーブルからデータを読み取って挿入するクラスで上記のコードを使用すると、完全に機能します:)。しかし、2つのテーブルからデータを読み取って挿入するクラス(実際には本当に必要な場所)で使用しようとすると、sqliteの誤用が発生します。

データベースを開いたり閉じたりするコードを確認しましたが、問題はありません。私が他を削除しない限り、それらは機能します。

私はios5を使用していますが、これは私のプロジェクトにとって本当に大きな問題です。Instagramがpostgresqlを使用していると聞きましたが、これが理由でしたか?最初にpostgresqlまたはsqliteを提案しますか?

4

1 に答える 1

2

2 つのことがごちゃ混ぜになっているように思えます。

シングルスレッドとマルチスレッド

シングル スレッド ビルドは、コードの1 つのスレッドからのみ安全に使用できます。これは、複数のスレッドから安全に使用できるメカニズム (ミューテックス、クリティカル セクションなど) が内部的にないためです。複数のスレッドを使用している場合は、マルチスレッド ビルドを使用してください (または、「興味深い」トラブルが予想されます。警告されています)。

SQLite のスレッド サポートは非​​常に単純です。マルチスレッド ビルドでは、特定の接続は単一のスレッドからのみ使用する必要があります (最初に別のスレッドで開くことができる場合を除く)。

最近の (ここ数年?) SQLite ビルドはすべて、複数のプロセスから単一のデータベースへのアクセスに満足していますが、並列処理の程度は…</p>

取引タイプ

一般に、SQL は複数のタイプのトランザクションをサポートします。SQLite はそれらのサブセットのみをサポートし、そのデフォルトは SERIALIZABLE です。これが最も安全なアクセス モードです。一度に 1 つのことしか起こらない場合に表示されることをシミュレートします。(内部的には、一度に多くのリーダーを許可するスキームを使用して実装されていますが、ライターは 1 つだけです。誰かが他の人を飢えさせるのを防ぐための巧妙さがあります。)

SQLite は、コミットされていない読み取りトランザクションもサポートしています。これにより、コードで使用できる並列処理の量が増えますが、永続化が保証されていない情報が読者に表示されるリスクがあります。これが重要かどうかは、アプリケーションによって異なります。

于 2012-02-26T16:53:40.953 に答える