我們在我們的應用程序中使用SQLite作爲共享數據庫。 (我知道這不是最好的解決方案,但服務器/客戶端架構是不可能的) 只有幾個用戶,一個很小的數據庫,只有很少的寫入。SQLite在多用戶本地網絡環境下性能差的問題
的應用程序是用C#和我們使用System.Data.SQLite.dll但問題也occures例如與SQLiteDatabaseBrowser
只要只有一個用戶連接到數據庫,並查詢了一些成果,這是非常快的。幾毫秒。一個用戶可以建立多個連接,並行執行select語句。這對性能也沒有影響。
但是,只要另一個來自不同mashine的用戶連接到db,對於每個連接的用戶來說,性能變得非常差。只要所有連接/應用程序都關閉,性能就會很差。 之後,第一個連接的用戶將獲得良好的性能,直到下一個用戶連接。
我嘗試了很多東西:
- PRAGMA同步= OFF
- 更新到拉泰什sqlite的版本(創建與該版本的新數據庫文件)
- DB-文件 只讀
- 網絡共享只讀爲大家
- 連接字符串與不同的選項(幾乎所有)
- 不同的sqlite程序(我們的ap摺疊和SQLiteDatabaseBrowser)
- 不同的文件系統上(NTFS和FAT32)
在那之後,我寫了打開一個連接一個小應用程序hostet,查詢了一些成果,並顯示經過的時間。這一切都在無休止的循環中。
下面是這個簡單的應用程序的代碼:
static void Main(string[] args)
{
SQLiteConnectionStringBuilder conBuilder = new SQLiteConnectionStringBuilder();
conBuilder.DataSource = args[0];
conBuilder.Pooling = false;
conBuilder.ReadOnly = true;
string connectionString = conBuilder.ConnectionString;
while (true)
{
RunQueryInNewConnection(connectionString);
System.Threading.Thread.Sleep(500);
}
}
static void RunQuery(SQLiteConnection con)
{
using (SQLiteCommand cmd = con.CreateCommand())
{
cmd.CommandText = "select * from TabKatalog where ReferenzName like '%0%'";
Console.WriteLine("Execute Query: " + cmd.CommandText);
Stopwatch watch = new Stopwatch();
watch.Start();
int lines = 0;
SQLiteDataReader reader = cmd.ExecuteReader();
while (reader.Read())
lines++;
watch.Stop();
Console.WriteLine("Query result: " + lines + " in " + watch.ElapsedMilliseconds + " ms");
}
}
static void RunQueryInNewConnection(string pConnectionString)
{
using (SQLiteConnection con = new SQLiteConnection(pConnectionString, true))
{
con.Open();
RunQuery(con);
}
System.Data.SQLite.SQLiteConnection.ClearAllPools();
GC.Collect();
GC.WaitForPendingFinalizers();
}
雖然有這個小應用程序進行測試時,我意識到,這是足以讓其他系統採取的文件句柄的sqlite的分貝降低性能。所以看起來,這與連接到數據庫沒有任何關係。性能保持低水平,直到所有文件句柄被釋放。我用procexp.exe跟蹤它。另外,只有遠程系統遇到性能問題。在db文件主機本身上,查詢每次都運行得很快。
有沒有人遇到同樣的問題或有一些提示?
Thx的嘗試,但我並不需要高併發性。我只想在合適的時間從平行的多個客戶端的sqlite數據庫中讀取數據。 – Schmurgel
您所說的是,對於Windows上的SQLite,併發性不夠高。 –
這是個問題:-)。我無法相信,這是使用sqlite和Windows或smb共享的常見問題。簡單查詢的執行時間從100ms增加到30k ms。現在我想在我們更換數據庫之前使用這些設置驗證其他用戶的經驗。 – Schmurgel