2017-03-22 27 views
3

我們在我們的應用程序中使用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文件主機本身上,查詢每次都運行得很快。

有沒有人遇到同樣的問題或有一些提示?

回答

0

Windows不會緩存在另一臺計算機上同時訪問的文件。

如果您需要高併發性,請考慮using a client/server database

+0

Thx的嘗試,但我並不需要高併發性。我只想在合適的時間從平行的多個客戶端的sqlite數據庫中讀取數據。 – Schmurgel

+0

您所說的是,對於Windows上的SQLite,併發性不夠高。 –

+0

這是個問題:-)。我無法相信,這是使用sqlite和Windows或smb共享的常見問題。簡單查詢的執行時間從100ms增加到30k ms。現在我想在我們更換數據庫之前使用這些設置驗證其他用戶的經驗。 – Schmurgel