2011-08-02 63 views
18

この質問は申し訳ありませんが、私は概念を理解していれば分かりませんが、SQLiteはServerlessです。これはローカルマシンのデータベースを意味し、1つのファイルに格納されています。 1つのクライアントはそれを読み取り、それは他のクライアントの読み取りモードのためだけに作られ、クライアントが書き込みを行うと、すべてのクライアントは書き込みモードを持つので、一度に1つのモードになります。 私はdjangoアプリケーション、たとえばブログを作ったと想像してください。それはどのようにsqliteを使って作られていますか?クライアントがブログに入ると、ページとブログのエントリを見るための読み込みモードが得られ、登録されたクライアントがコメントを追加しようとすると、ファイルは書き込みモードになるので、どのようにsqliteがこれを処理できますか? SQLiteは、テストと学習の目的で、BaseHTTPServer(djangoに同梱されているサーバ)と同じようにここにありますか?DjangoでSQLiteを本番環境で使用していますか?

答えて

29

さまざまなデータベースがさまざまな方法で並行処理を管理しますが、sqliteではグローバルデータベースレベルのロックが使用されます。一度に1つのスレッドまたはプロセスだけがsqliteデータベースを変更できます。他のすべての並行プロセスは、現在実行中のプロセスが終了するまで強制的に待機します。

ユーザー数が増えるにつれて、 sqliteの単純なロック戦略はますますロック競合の激しさを増し、MySQL(行レベルロックを行うことができる、少なくともInnoDBエンジンで)やPostgreSQL(Multiversion Concurrency Controlを使用する)などの別のデータベースにデータを移行する必要があります。 。かなりの数のユーザーを獲得することが予想される場合(1日のうちの1日あたり1リクエスト以上のレベルで)、sqliteから移行する必要があります。すぐにそうするほど、簡単になるでしょう。

+0

djangoチュートリアルPostegreSQLが優れていると思われますか?どう思いますか? – Abdelouahab

+7

あなたが意見を求めているのなら、私からは、はい、私はPostgreSQLが優れていると思います。しかし、これはそのような議論のための適切な場所ではありません。客観的な比較のために[wikipedia](http://en.wikipedia.org/wiki/Comparison_of_relational_database_management_systems)を見てください。 – SingleNegationElimination

+1

私はPostgreSQLとMySQLを使用します。主にトランザクションサポートのために、より大きなプロジェクトではPostgreSQLが好きですが、MySQLは小規模なアプリケーションでは問題ありません。 –

6

データベース理論ではこの問題は、並行処理と呼ばれ、SQLiteのは、Windowsのバージョンでそれをサポートしている> Win98の他の場所のFAQによると:

http://www.sqlite.org/faq.html#q5

当方は一切の他の組み込みSQLデータベースエンジンを認識していますこれは、 としてSQLiteとして並行処理をサポートしています。 SQLiteは、複数のプロセスが データベースファイルを一度に開き、複数のプロセスが データベースを一度に読み取るようにします。いずれかのプロセスが書き込みを要求している場合は、その更新中にデータベースファイル全体をロックする必要があります( )。しかし、通常は には数ミリ秒しかかかりません。他のプロセスは、作者 を待ってから終了し、ビジネスについて続けます。他の埋込みSQL データベースエンジンでは、通常、1つのプロセスでデータベースを一度に に接続することしかできません。

基本的には、並行性について心配する必要はありません。塩の価値のあるデータベースであれば問題ありません。 SQLite3がこれをどのように管理しているかの詳細については、hereを参照してください。データベース設計者ではなく、開発者として、あなたが内的な働きに興味がない限り、それを気にする必要はありません。

+0

これはほんの数秒の問題ですか?それは時分割のアイデアのようなものですか? – Abdelouahab

1

SQLiteは実際には生産用ではありません。 MySQLやPostgreSQLをWindows上で稼動させることは非常に簡単で、実際のデータベースを持っています。

本当の問題はSQLite3のはこれだけ1ページビューは、私も開発にSQLite3のを使用していないhttps://code.djangoproject.com/ticket/12118

このバグを参照して、サーバー上の時に発生する可能性がジャンゴに通されていないということです。

+0

SQLiteはテスト目的のためだけにここにありますか? – Abdelouahab

+2

Sqliteは、データベースの概念を教えるのに(設定が簡単であるため)、研究にも適しています(ソースコードは小さく単純です)。これらのことのそれぞれについて、SQLiteは本当に輝きます。トランザクションの負荷が大きい場合は、はるかに優れたオプションがあります。 – SingleNegationElimination

+1

はい、テスト/開発。より複雑なサイトを構築し始めると、実際のデータベースが必要になります。おそらく多少の生のSQLが必要になるでしょう(私は3つのDjangoサイトを構築しましたが、3つすべてがいくつかのクエリに対して生のSQLを必要としていました) –

5

SQLiteはではなく、のようにBaseHTTPServerまたは基本的なものがあります。これは完全に機能した埋め込みデータベースです。かなり速いです。そのSQL言語は、ほとんどの鐘や笛がないかもしれませんが、十分柔軟です。私は、私が関わっているプロジェクト(あなたの典型的なWebアプリケーションではない、真実が伝えられている)のためにはできないことが必要な場合に遭遇していません。

実際のデザインについて議論することなく、SQLiteの生産性が良いか悪いかを主張する人は、それほど多くのことを教えてくれません。 SQLiteはかなり高速です。いくつかのケースでは、文字通りの大きさがよりも速く、例えば、ジャンゴナウトの間の代替手段として登場するPostgresよりも速い。他の人が指摘しているように、これは並行処理も多くサポートしています。あなたのアプリが「いくつかのケース」に該当するかどうかの問題です。

ここで考慮すべき重要な要素が1つあります。 SQLiteはインプロセスデータベースです。これは本当に重要です。あなたがgeventのようなものを使用している場合、あなたのアプリケーションが壊れている辺のケースに入るかもしれません。たとえば、途中でコンテキストスイッチを使用してトランザクションを実行しようとすると、おそらく恐ろしい方法でトランザクションが中断される可能性があります。言い換えれば、SQLiteはの部分のアプリだから、 '並行性'は本当にあなたのアプリに依存します。

スケーラビリティの面ではSQLiteではできないことは、他のデータベースエンジンと同じようにSQLiteサーバのクラスタをプロセス内に置くことができないことです。あなたのアプリは、スケーリングの点でこのような長さにする必要はないかもしれませんが、私の推測では、そこにあるアプリの大部分はとにかく(野生のもの)ではありません。

一方、処理中とはカスタム関数を追加することを意味し、集約はそれほど簡単ではありません。私はDjangoのORMがそれ以上の難しさを持っているかどうかはわかりませんが、それらの機能を利用してかなり良いデザインを思いつくことができます。

関連する問題