私はデータベースとSQLiteのためのさまざまなベストプラクティスを読んでいました。読んでいるうちに、私がやってはいけないことがたくさんあることが判明しました。これらの問題を修正しようとすると、ADOの実装でSQLiteを使用する細かいディテールについて考えると混乱しました。SQLite/C#接続プーリングと準備文の混同
私の混乱は、特に準備文と接続プーリングに由来します。
http://msdn.microsoft.com/en-us/library/ms971481.aspxを読んでいるうちに、接続はトランザクションのためだけに開く必要があることがわかりました。トランザクションが完了したら、接続を終了する必要があります。なぜこれが当てはまるのかをしっかりと把握することはできませんが、私は作者がそれをよく知っているという前提で取り組んでいます。接続が閉じられると、実際には閉鎖されました。それは単にそれがプールに戻されたことを意味します。
私のクエリと挿入を改善するために、私はプリペアドステートメントの使用について読んでいます。 In SQLite, do prepared statements really improve performance?とhttp://petesbloggerama.blogspot.com/2007/02/sqlite-adonet-prepared-statements.htmlはどちらも、準備されたステートメントが複数回実行されるクエリの実行時に実行されることを示しているようです。また、準備されたステートメントは接続に固有であり、接続が閉じられると準備されたステートメントは失われることも読んでいます。
私の混乱はこれです。私が接続を開いたり閉じたりしている場合(接続がスレッドプールのために閉じられていることを意味する場合もあれば、そうでない場合もあります)、準備されたステートメントから実際にどれだけの使用量が得られますか?私は1000のオブジェクトがある場合、私は準備されたステートメントが多くを助けることができる単一のトランザクションで保存する必要があることを理解することができます。しかし、接続を閉じると、最初のオブジェクトから生成されたプリペアドステートメントが失われるため、トランザクションで単一のオブジェクトを保存することによるメリットがあるとは思えません。これは真実な陳述ですか?
私の混乱は、準備されたステートメントが自分のSQLiteCommandオブジェクトのスコープにリンクされていると信じているという事実によります。
私は頻繁に実行されるクエリを表しSQLiteCommandを作成した場合、私はアクティブな滞在するプリペアドステートメントのためにメモリにそのSQLiteCommandを維持する必要がありますか?
私は同じSQLiteの文で新しいSQLiteCommandを作成した場合、それは新しいSQLiteCommandは前回と同じであるので、使用することができプリペアドステートメントを持っていることを認識しているのですか?
私はメモリにSQLiteCommandを維持し、私が開いて、別の取引のための接続を閉じるように、パラメータおよび接続の変更した場合、私は本質的に異なる接続間で生きてプリペアドステートメントを保管しておりますか!
私はこの時点で物事を考え超える可能性が高いですが、私はあなたが私はより良いこれらの事は、私はそれらのうちの最大の利益を得ることができますどのように相互作用するかを理解するのに役立つことを願って。
私はSQLiteに精通していませんが、なぜあなたはすぐに接続を閉じるべきかに関しては、あなた自身が答えようとしています。基本的な物理接続は閉じられていません。その意味は、他のスレッドが使用できることです。接続にハングアップしても、実際には使用しない場合は、最大限の使用率が制限されることは明らかです。 (同じように、あなたがシングルスレッドのコンテキストであれば、接続プーリングはあまり意味がありませんが、多くのことを傷つけることはありません) –