加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – SQLite在多用户本地网络环境中的性能不佳问题

发布时间:2020-12-15 21:05:41 所属栏目:百科 来源:网络整理
导读:我们在应用程序中使用SQLite作为共享数据库. (我知道这不是最好的解决方案,但服务器/客户端架构是不可能的) 只有少数用户,一个非常小的数据库,只有很少的写入. 该应用程序是用c#编写的,我们使用System.Data.SQLite.dll,但问题也出现在例如SQLiteDatabaseBrow
我们在应用程序中使用SQLite作为共享数据库. (我知道这不是最好的解决方案,但服务器/客户端架构是不可能的)
只有少数用户,一个非常小的数据库,只有很少的写入.

该应用程序是用c#编写的,我们使用System.Data.SQLite.dll,但问题也出现在例如SQLiteDatabaseBrowser上

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

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

我尝试了很多东西:

> PRAGMA synchronous = OFF
>更新到lates sqlite版本(并使用该版本创建了一个新的db文件)
> DB-File只读
>每个人只读网络共享
>具有不同选项的连接字符串(几乎所有)
>不同的sqlite程序(我们的应用程序和SQLiteDatabaseBrowser)
>不同的文件系统hostet on(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 db上获取文件句柄就可以降低性能.所以看来,这与db的连接无关.性能保持低,直到释放所有文件句柄.我用procexp.exe跟踪它.此外,只有远程系统遇到性能问题.在db文件主机本身上,每次查询都会快速运行.

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

解决方法

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

如果您需要高并发性,请考虑using a client/server database.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读