0

0

Dapper如何分批处理大量数据 Dapper数据批量读取与操作

煙雲

煙雲

发布时间:2025-12-16 01:21:16

|

801人浏览过

|

来源于php中文网

原创

Dapper分批处理大量数据需手动实现分页查询或流式读取,避免内存溢出;推荐OFFSET-FETCH分页(小偏移)或游标分页(大偏移),配合IAsyncEnumerable流式处理、参数化批量写入及每批独立事务+断点续跑机制。

dapper如何分批处理大量数据 dapper数据批量读取与操作

用 Dapper 分批处理大量数据,核心是避免一次性加载全部结果到内存,同时保持数据库连接轻量、SQL 高效。关键在于手动分页查询、流式读取(QueryAsync + IAsyncEnumerable)或配合 SQL 的分页/游标机制,而不是依赖 Dapper 自动“分批”——它本身不提供内置的批量分片能力。

使用 OFFSET-FETCH 或 ROW_NUMBER 实现服务端分页

适合数据有序、可预估总条数的场景(如按 ID 或时间排序)。每次只查一页,减少单次内存占用和网络传输压力。

  • SQL 示例(SQL Server):
    SELECT * FROM Orders WHERE Status = @status ORDER BY Id OFFSET @skip ROWS FETCH NEXT @take ROWS ONLY
  • C# 调用时循环执行,每次更新 @skip(如 0, 1000, 2000…),@take 建议 500–5000,视单行大小和网络延迟调整
  • 注意:OFFSET 越大性能越差,超 10 万行建议改用游标(keyset pagination),例如 WHERE Id > @lastId ORDER BY Id LIMIT @take

用 IAsyncEnumerable 流式读取(.NET 5+)

避免把整张表拉进 List,而是边读边处理,内存占用恒定。

  • 写法示例:
    await foreach (var order in connection.QueryAsync("SELECT * FROM Orders WHERE ...")) { Process(order); }
  • 底层复用 DataReader,不缓存全部结果;但要求连接保持打开,且业务逻辑不能跨 await 长时间阻塞
  • 适合 ETL、导出、校验类任务;不适合需要随机访问或多次遍历的场景

批量写入:用 ExecuteAsync + 参数化 IN 或临时表

Dapper 不直接支持批量 INSERT,需自己拼 SQL 或借助扩展(如 Dapper.FastCRUD);但安全高效的做法仍是分组 + 参数化。

动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版
动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版

动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包

下载
  • 小批量(≤ 1000 条):拼 INSERT INTO ... VALUES (@p0), (@p1), ...,参数用 DynamicParameters 批量添加
  • 大批量(> 1000):优先走 SQL Server 的 SqlBulkCopy(需 DataTable 或 IDataReader),或 PostgreSQL 的 COPY;Dapper 只负责触发
  • 避免用循环单条 ExecuteAsync,哪怕加了事务,网络往返开销也极大

结合事务与批次控制防中断

长耗时批处理必须考虑失败恢复,不能让整个流程因一条脏数据失败而重来。

  • 每批(如 1000 条)单独开事务,成功则提交,失败则记录错误 ID 并跳过,继续下一批
  • 维护一个轻量 checkpoint 表(如 BatchLog),记录已处理的最大 ID 或时间戳,程序重启后从断点续跑
  • 慎用大事务:SQL Server 中长时间事务会阻塞日志截断,可能撑爆日志文件

基本上就这些。Dapper 是轻量 ORM,分批不是它该干的事,而是你用它写出更可控的 SQL 和执行逻辑。重点在设计好分片策略、选对读写模式、管住连接和事务生命周期。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

683

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

320

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

347

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1095

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

357

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

676

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

575

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

417

2024.04.29

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

23

2026.01.19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Java 教程
Java 教程

共578课时 | 47.9万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号