产品战略专家梁宁确认出席AICon北京站,分享AI时代下的商业逻辑与产品需求 了解详情
写点什么

ADO.NET 4.5 中的异步与流特性

  • 2012-06-03
  • 本文字数:925 字

    阅读完需:约 3 分钟

.NET 4.5 为仍在选择直接与 DataReader 系列类打交道的.NET 开发人员带来了一些新的异步与流特性支持。

SqlDataReader 允许开发人员在减少一些便利性的基础上获得更好的性能。例如,该类不管需要从服务器等待多少个数据包,通常都会一次性读取整行。如果有多个大型对象列,SqlDataReader 会将它们一次性存储进内存中。如果你切换至顺序访问,那么将不再需要缓存整行,不过必须按照顺序对列进行读取。

借助.NET 4.5 中的顺序访问,开发人员可以有选择地使用 NextResultAsync、ReadAsync、IsDBNullAsync 与 GetFieldValueAsync 进一步地调整性能。需要澄清一点的是, ADO.NET 的异步方法不会自动提升性能,并且对于单线程提速可能毫无作用。不过,它们可以提升处理大量并发请求时的性能,因为它们减少了线程阻塞。底层你需要做的是构建 Task 对象,要注意这会对垃圾收集器造成压力。一般来说,我们建议:

  1. 尽可能地使用 NextResultAsync 异步处理数据包;
  2. 在两个模式下都优先选择 ReadAsync 以使大量数据包再次被异步处理;
  3. 不要在顺序模式下使用 IsDBNullAsync 与 GetFieldValueAsync。列在该模式下已经被缓存,因此创建 Task 对象没什么作用。

对于顺序模式,决定是否使用 GetFieldValueAsync 稍微有些复杂,Daniel Paoliello 解释说:

不管怎样,如果你在非线性访问模式调用 Read,或者如果你正在使用线性访问模式,那么决定将会非常困难,因为你需要考虑从目标列读取多少数据以及该列包含多少数据。如果你已经读完了前一列,并且目标列较小(如 Boolean、DateTime 或数字类型),那么你也许可以考虑使用一个同步方法。相反,如果目标列较大(如 varbinary(8000))或者你需要读取以前的数据较多的类,那么使用一个异步方法可能会更好。最后,如果目标列数据非常大(如 varbinary(MAX)、varchar(MAX)、nvrchar(MAX) 或 XML),那么你应当取而代之考虑新的 GetStream GetTextReader GetXmlReader 方法。

当与存储在数据库中的大文件打交道时,使用基于流的方法会有一些好处。例如,你可以将流转换至 WCF 或 ASP.NET 响应,而不用一次向将整个文件读进内存。这对于.NET 开发人员尤为重要,因为大对象堆对于存储碎片非常敏感。

查看英文原文: In Case You Missed It: Async and Streaming for ADO.NET 4.5

2012-06-03 11:272236
用户头像

发布了 125 篇内容, 共 37.3 次阅读, 收获喜欢 5 次。

关注

评论

发布
暂无评论
发现更多内容

《MySQL入门很轻松》第5章:数据完整性及其分类

乌龟哥哥

9月月更

linxu入门指令

乌龟哥哥

9月月更

多线程——死锁的原因和解决方案

StackOverflow

编程 多线程 10月月更

React面试:谈谈虚拟DOM,Diff算法与Key机制

beifeng1996

React

【牛客刷题-算法】1-算法入门-数据结构-栈

清风莫追

算法与数据结构 10月月更

部署华为云DWS过程

乌龟哥哥

9月月更

《MySQL入门很轻松》第4章:数据表中存放的数据类型

乌龟哥哥

9月月更

测试

乌龟哥哥

9月月更

阿里云搭建halo博客

乌龟哥哥

9月月更

【牛客刷题-算法】 NC19 连续子数组的最大和

清风莫追

数据结构与算法 10月月更

【牛客刷题-算法】 NC13 二叉树的最大深度

清风莫追

二叉树 数据结构与算法 10月月更

Python之简易计算器的制作

梦笔生花

Python 9月月更 简易计算器

2022-09-30:以下go语言代码输出什么?A: true true false true false; B: true false false true false; C: true true

福大大架构师每日一题

开发者有话说|我想给你讲一个故事

石云升

个人成长 9月月更

极速体验SpringCloud Gateway

程序员欣宸

Java SpringCloud SpringCloud Gateway 9月月更

启动 Hello Spring Security Boot 应用

HoneyMoose

多线程(进阶)

StackOverflow

编程 多线程安全 10月月更

14个你必须要知道的ubuntu快捷键

乌龟哥哥

9月月更

从单机百万tpmc到分布式千万tpmc,GaussDB性能提升的3个关键技术剖析

乌龟哥哥

9月月更

浅谈云原生安全

HummerCloud

云原生 云安全 云原生安全

第1章:初识数据库与MySQL----数据库基本概念

乌龟哥哥

9月月更

腾讯云搭建wordpress网站超详细介绍

乌龟哥哥

9月月更

Python之鸡兔同笼

梦笔生花

9月月更 Python语法 鸡兔同笼

《MySQL入门很轻松》第2章:MySQL管理工具介绍

乌龟哥哥

9月月更

GaussDB(DWS)如何实现实时,批量和交付式查询一站式开发

乌龟哥哥

9月月更

promise执行顺序面试题令我头秃,你能作对几道

loveX001

JavaScript

问:React的setState为什么是异步的?

beifeng1996

React

计算机网络——MAC地址、IP地址

StackOverflow

编程 计算机网络 10月月更

Python之斐波那契数列的实现

梦笔生花

Python 9月月更 斐波那契数列

大数据ELK(九):使用VSCode测试分词器

Lansonli

ELK 10月月更

面试官:说说Event Loop事件循环、微任务、宏任务

loveX001

JavaScript

ADO.NET 4.5中的异步与流特性_语言 & 开发_Jonathan Allen_InfoQ精选文章