gpt4 book ai didi

c# - 在不同的应用程序线程上同时写入多个 SQLite 数据库的并发问题

转载 作者:太空宇宙 更新时间:2023-11-03 15:49:50 25 4
gpt4 key购买 nike

我对此进行了大量搜索,但运气不佳。作为测试,我编写了一个 C# WinForms 应用程序,我在其中启动了可配置数量的线程,并让每个线程将可配置数量的数据写入该线程创建的 SQLite 数据库中的多个表。所以每个线程都创建它自己的 SQLite 数据库,并且只有那个线程与之交互。

我所看到的是并发性肯定会导致一些性能下降。例如,如果我大致同时启动每个线程,那么与如果我在每个线程中放置一个随机启动延迟以分散它们的访问相比,写入 SQLite 表的性能会直线下降。

SQLite 的启动速度足以满足我的测试需求,我可以在三分之一秒内在表中插入 20,000 行,但是一旦我启动 250 个线程,同样的 20,000 行可能需要几分钟才能写入每个数据库。

我已经尝试了很多方法,包括定期提交、设置 Sychronous=Off、使用参数化查询等……所有这些都有助于缩短每个语句所花费的时间(并因此减少并发的变化)事件),但没有真正解决它,我希望有人能提供一些建议。

谢谢!安迪

最佳答案

在任何关系数据库中,写入并发过多确实会导致速度下降。根据您尝试优化的场景,您可以做各种其他事情,我能想到的很少有:

1) 创建批处理而不是并发写入,这意味着如果您期望大量用户同时写入,收集他们的数据并以更大的组将它们刷新,请注意,这意味着,当我们的队列正在收集数据时如果应用程序出现故障,您将丢失数据,您可以对非关键数据(例如日志)执行此操作。

2) 如果你的线程在插入数据之前还需要做其他工作,你仍然可以拥有我们的线程,然后添加一个信号量或与发生插入的代码部分等效的东西,这将限制并发性并加快整个过程。

3) 如果你想做的是通过你正在尝试制作的工具进行批量插入,那么在你的问题中提到,很多 mysql dba 会比我更好地回答我们的问题。

关于c# - 在不同的应用程序线程上同时写入多个 SQLite 数据库的并发问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26330604/

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