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

时间:2014-10-12 22:20:11

标签: c# sqlite concurrency

我已经对此做了大量的搜索,并且没有多少运气。作为测试,我编写了一个C#WinForms应用程序,我在其中调整可配置数量的线程,并让每个线程将一个可配置数量的数据写入该线程创建的SQLite数据库中的许多表。因此每个线程创建它自己的SQLite数据库,并且只有该线程与它交互。

我所看到的是,由于并发性,肯定会出现一些性能下降。例如,如果我大致同时开始每个线程写入SQLite的表PLUMMETS的性能,那么如果我在每个线程中放置一个随机启动延迟来扩展其访问权限。

SQLite很快就可以快速启动我的测试,我可以在三分之一秒内在一个表中插入20,000行,但是一旦我启动250个线程,那些相同的20,000行可以将MINUTES写入每个数据库。

我尝试了很多东西,包括定期提交,设置Sychronous = Off,使用参数化查询等等......这些都有助于缩短每个语句所需的时间(从而减少更改)并发活动)但没有什么能真正解决它,我希望有人能给出一些建议。

谢谢! 安迪

1 个答案:

答案 0 :(得分:0)

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

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

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

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