并发问题在不同的应用程序线程上同时写入多个SQLite数据库
本文关键字:数据库 SQLite 线程 问题 并发 应用程序 | 更新日期: 2023-09-27 18:26:16
我在这方面做了很多搜索,运气不太好。作为测试,我编写了一个C#WinForms应用程序,在该应用程序中,我启动了可配置数量的线程,并让每个线程向该线程创建的SQLite数据库中的多个表写入可配置的数据量。因此,每个线程都创建自己的SQLite数据库,并且只有该线程与之交互
我看到的是,由于并发性,性能肯定会下降。例如,如果我大致同时启动每个线程,向SQLite的表PLUMMETS进行性能写入,而不是在每个线程中设置随机启动延迟来分散它们的访问。
SQLite的启动速度很快,我可以在三分之一秒内在表中插入20000行,但一旦我启动了250个线程,同样的20000行可能需要几分钟才能写入每个数据库。
我尝试了很多方法,包括定期提交、设置Sychronous=Off、使用参数化查询等。这些都有助于缩短每条语句所需的时间(从而减少并发活动的变化),但没有什么能真正解决这个问题,我希望有人能给我一些建议。
谢谢!Andy
在任何关系数据库中写入过多的并发性都会导致一些速度减慢。根据你试图优化的场景,你可以做各种其他事情,我能想到的很少有:
1) 创建批处理而不是并发写入,这意味着如果您希望大量用户同时写入,收集他们的数据并将其按较大的组刷新,请注意,这意味着您的队列在收集时,如果应用程序出现故障,您将丢失数据,您可以对日志等非关键数据执行此操作。
2) 如果ur线程在插入数据之前也需要做其他工作,那么u仍然可以拥有我们的线程,然后添加一个信号量或类似于插入代码部分的东西,这将限制并发性并加快整个过程。
3) 如果你想做的是通过你正在尝试制作的工具进行批量插入,那么在你的问题中提到,很多mysql-dba会比我更好地回答我们的问题。