SQLiteでJavaを使用してデータベースプログラミングを行っています。
データベースへの一度に1つの接続のみが書き込み機能を持ち、多くの接続が一度に読み取り機能を持つことがわかりました。
SQLiteのアーキテクチャがなぜこのように設計されたのですか?書き込まれている2つのものがデータベース内の同じ場所に書き込まれていない限り、なぜ2つの書き込みが一度にできないのですか?
SQLiteでJavaを使用してデータベースプログラミングを行っています。
データベースへの一度に1つの接続のみが書き込み機能を持ち、多くの接続が一度に読み取り機能を持つことがわかりました。
SQLiteのアーキテクチャがなぜこのように設計されたのですか?書き込まれている2つのものがデータベース内の同じ場所に書き込まれていない限り、なぜ2つの書き込みが一度にできないのですか?
回答:
「複数の同時書き込み」は、シングルライター、マルチリーダーよりもコアデータベースエンジンで達成するのがはるかに難しいためです。SQLiteの設計パラメーターを超えており、それを含めると、SQLiteの非常に小さいサイズと単純さを覆す可能性があります。
高度な書き込み同時実行性のサポートは、DB2、Oracle、SQL Server、MySQL、PostgreSQL、NonStop SQL、Sybaseなどの大規模データベースエンジンの特徴です。しかし、達成するのは技術的に困難であり、データベース、テーブル、行のロックなどの広範な同時実行制御と最適化戦略、または最新の実装では複数バージョンの同時実行制御が必要です。この問題/要件に関する研究は膨大で、数十年前に遡ります。
SQLiteの設計哲学は、複数のライターをサポートするほとんどのサーバー中心のDBMSとはまったく異なります。SQLとリレーショナルモデルの力を個々のアプリケーションにもたらし、実際に各アプリケーションに組み込むことができるように設計されています。その目標には大きなトレードオフが必要です。複数の同時ライターを処理するために必要な重要なインフラストラクチャとオーバーヘッドを追加しないこともその1つです。
この哲学は、SQLiteの適切な使用ページのステートメントで要約できます。
SQLiteは、クライアント/サーバーデータベースと競合しません。SQLiteはfopen()と競合します。
fopen()
いるため、プレーンテキストファイルへの同時書き込みに伴うすべての毛羽立ちを考慮してください。
物事を同じ場所に書き込むかどうかを判断できるサーバーがないためです。ファイルに書き込もうとするプロセスは2つだけです。
コメントで指摘したように、同時書き込みは内部スレッドでもサポートできます。これがどれだけうまく機能するかはわかりません(それについてもあまり考えませんでした)。とにかく、SQLiteがスレッドを使用しない理由は次のとおりです。Hipp博士はスレッドが悪だと考えています。
DR Hippがスレッドを悪であると考えているという事実は、SQLite FAQに文書化されています。