gpt4 book ai didi

c# - 多用户本地网络环境中的 SQLite 性能问题

转载 作者:行者123 更新时间:2023-11-30 12:56:10 33 4
gpt4 key购买 nike

我们在应用程序中使用 SQLite 作为共享数据库。 (我知道这不是最好的解决方案,但服务器/客户端架构是不可能的)只有几个用户,一个非常小的数据库和很少的写入。

该应用程序是用 C# 编写的,我们使用 System.Data.SQLite.dll但问题也会发生,例如 SQLiteDatabaseBrowser

只要一个用户连接到数据库,查询一些结果,就非常快了。只是几毫秒。一个用户可以建立多个连接并并行执行 select 语句。这对性能也没有影响。

但是一旦来自不同机器的另一个用户连接到数据库,每个连接的用户的性能就会变得非常差。只要关闭所有连接/应用程序,性能就会一直很差。之后,第一个用户连接,恢复良好的性能,直到下一个用户连接。

我尝试了很多东西:

  • PRAGMA 同步 = 关闭
  • 已更新到最新的 sqlite 版本(并使用该版本创建了一个新的 db 文件)
  • DB 文件只读
  • 对所有人只读的网络共享
  • 具有不同选项的连接字符串(几乎所有)
  • 不同的 sqlite 程序(我们的应用程序和 SQLiteDatabaseBrowser)
  • 托管在(NTFS 和 FAT32)上的不同文件系统

之后,我编写了一个小应用程序来打开连接、查询一些结果并显示耗时。这一切都在无限循环中。

这是这个简单应用程序的代码:

    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 文件主机本身上,查询每次都运行得很快。

有没有人遇到同样的问题或有一些提示?

最佳答案

Windows 不会缓存在另一台计算机上同时访问的文件。

如果需要高并发,可以考虑using a client/server database .

关于c# - 多用户本地网络环境中的 SQLite 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42955378/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com