多线程+ C#+性能+ SQLite

时间:2014-06-03 08:24:27

标签: c# multithreading sqlite

我有Windows窗体应用程序 (C#with visual studio 2010,Framework:4.0)

数据库:.db(文件数据库),通过SQLite连接对象

Thread th = new Thread(() => database(node, xNodetcname, xNodesqlquery1, xNodeHint, e, inXml));
th.Name = thread;
th.Start();

上面的代码创建每个线程并在database()函数上并行处理 每个线程都有一个SQL Query,用于从数据库中获取数据。

虽然我不使用多线程,但性能更好 但是当我使用多线程时,性能下降。

示例:

没有多线程3查询处理时间= 1.5分钟
使用多线程3查询处理时间= 1.9分钟。

我的目标是减少查询的处理时间。

2 个答案:

答案 0 :(得分:6)

然后一般远离线程。

一些基本的教程:在大多数情况下,数据库性能受IO而不是CPU的限制。 IO可以通过使用大量内存作为缓冲区来缓解,因此大型数据库服务器具有大量内存。

你运行一个小的轻量级数据库。它可能没有在数据库服务器级硬件或SSD上运行 - 因此它有IO问题。 Perforamcne将受到IO的限制。

现在多个线程确保IO端(硬盘)效率低下,特别是因为winform应用程序在高端IO子系统上没有正常运行。

Ergo:如果你想要更快的查询,那么:

  • 优化查询。 MIssing指数?
  • 获取适当的硬件和/或升级至heaver设置。 SSD是一个很好的帮助。

不要使用多线程 - 尝试在SQL级别解决它,但接受这可能是不可能的。这是公司仍然实际使用真实数据库服务器来处理大量数据的原因。而SQLite可能不是一个好选择 - 没有机会说它是不是因为你完全忽略了你信息中的那一面。

答案 1 :(得分:2)

这里有一些事情需要考虑:

  1. 您的数据库连接是否处于多线程模式(如this文档中所述)?
  2. 数据库引擎是否适合多线程(提示,SQLite不适用,请参阅@TomTom答案)
  3. 你是使用线程池(你不是)或者你每次都在初始化一个新线程(这很慢)