我一直花一些時間閱讀數據庫和SQLite的不同最佳實踐。在閱讀時,我發現自己做了很多事情,我不應該這樣做,當試圖解決這些問題時,在思考使用SQLite和ADO實現的一些細節時,我變得很困惑。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,但關於爲什麼一個人應該儘快關閉連接,你自己來接近自己回答:底層的物理連接沒有關閉,你只需將連接返回到池。其含義是它可以被其他線程使用。很明顯,如果你堅持連接但不實際使用它,那將限制最大可能的利用率。 (同樣清楚的是:如果您處於單線程環境中,連接池並沒有太多意義,儘管傷害不大。) –