【问题标题】:read SQL data from multiple threads从多个线程读取 SQL 数据
【发布时间】:2013-03-03 18:52:49
【问题描述】:

我有一个简单的任务 - 从 SQL 表中读取数据,对其进行处理,并在完成后 - 更新数据库中的一个字段(设置已处理=true),因此每条记录应该只处理一次。

你能告诉我,我可以用什么技术来做多线程?这意味着,在多个线程中从表中读取数据。

【问题讨论】:

  • 您可能不需要多个线程。你为什么认为你会这样做?
  • @JohnSaunders 为什么不呢?如果数据不相互依赖(即设置前 N 条记录与后续 N 条记录批次的处理无关),那么这是多线程的理想选择。如果有一个长时间运行的查询,通常将其拆分会减少整体处理时间。
  • @DavidKhaykin:涉及多少磁盘 I/O?你确定数据库不能比你更好地多线程吗?
  • @JohnSaunders - 取决于数据库设计,如果是集群,数据库如何被拆分成文件组等等等等。从简单的意义上来说,可以说数据库(MS SQL 服务器)旨在有效地处理多个并发请求,并且通过多线程(即发送多个请求),您可以利用此功能。如果您从一个表发送一个针对 1,000,000 行的请求,而不是针对每个 100,000 行发送 10 个并发请求,那么您在后者中模拟 10 个客户端同时访问数据库 - 它不会为您执行此操作,因为只有一个查询会拉大记录集。

标签: c# .net sql-server multithreading


【解决方案1】:

如果您想在多个线程中读取数据而不发生重叠,那么您可以尝试分页。您可以让每个线程读取不同的页面。例如,您可以让第一个线程读取前 20 条记录,处理其中的每条记录,然后为每条记录设置 processes=true,而第二个线程对接下来的 20 条记录执行相同的操作,依此类推。

查看此链接以获取有关多线程分页的更多信息。 http://ericniemiec.wordpress.com/2010/06/10/paging-records-in-sql-server-2008-for-processing-database-records-on-different-threads-in-c/

【讨论】:

  • 是的,我只想补充一点,批次大小应该取决于预期记录集的整体大小,以便一些试错类型调整可以揭示理想的批次数量,以将数据分解为.
【解决方案2】:

如果你使用 ef 并使用 DataContext 你应该知道 DataContext 不是线程安全的。像 MsSQL 这样的数据库管理系统是线程安全的。我更喜欢你读这个question

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多