c# – SQLite在多用户本地网络环境中的性能不佳问题
我们在应用程序中使用SQLite作为共享数据库. (我知道这不是最好的解决方案,但服务器/客户端架构是不可能的)
只有少数用户,一个非常小的数据库,只有很少的写入. 该应用程序是用c#编写的,我们使用System.Data.SQLite.dll,但问题也出现在例如SQLiteDatabaseBrowser上 只要只有一个用户连接到数据库并查询某些结果,它就会非常快.只有几毫秒.一个用户可以建立多个连接并并行执行select语句.这对性能也没有影响. 但是,只要来自不同mashine的另一个用户连接到数据库,每个连接用户的性能就会变得非常差.只要所有连接/应用程序都关闭,性能就会很差. 我尝试了很多东西: > PRAGMA synchronous = OFF 之后,我写了一个小应用程序,打开一个连接,查询一些结果并显示通过的时间.这一切都在无尽的循环中. 这是这个简单应用程序的代码: 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 db上获取文件句柄就可以降低性能.所以看来,这与db的连接无关.性能保持低,直到释放所有文件句柄.我用procexp.exe跟踪它.此外,只有远程系统遇到性能问题.在db文件主机本身上,每次查询都会快速运行. 有没有人遇到同样的问题或有一些提示? 解决方法
Windows不会缓存在另一台计算机上同时访问的文件.
如果您需要高并发性,请考虑using a client/server database. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |