.NET应用访问数据库之数据库的开销问题
2010-03-05 19:30 Virus-BeautyCode 阅读(2965) 评论(4) 编辑 收藏 举报
拿今天的一个例子说话吧,那就表中存放的是全国的地域信息,表结构如下:
首先用代码生成器和存储过程生成器生成基本表的操作,推荐两个工具:动软.Net代码生成器- 全功能的三层架构.Net代码生成器和codeplex上面的一个存储过程生成工具Stored Procedure Generator (for SQL Server 2000/2005 ... 。
现在提供了一个方法,可以获取顶级和二级地域的信息,最开始的做法是先获取顶级的地域信息,然后循环顶级地域信息,获取它的子节点。

KB.DSN.BusinessAccess.District dictrictBll = new KB.DSN.BusinessAccess.District();
topDistrictList = dictrictBll.GetEntityList(string.Format("DisFatherCode='{0}' {1}", 0, Settings.District_Order_By));
foreach (KB.DSN.Entity.District dis in topDistrictList)
{
dis.ChildrenDis = dictrictBll.GetEntityList(string.Format("DisFatherCode='{0}' {1}", dis.DisCode, Settings.District_Order_By));
}
return topDistrictList;
上面的做法,可以实现功能,最后测试获取一级和二级的地域信息,花费时间5秒左右,不说能接受吧,起码可以忍受。HttpWatch: An HTTP Viewer and HTTP Sniffer for IE and Firefox 这个工具可以查看浏览器获取数据的时间。
后面又写了一个方法,可以根据地域编号和想要获取的层级数目,获取指定地域下面的N层地域。和上面差不多,完成后一次是,一次获取上海下面的二级花费10秒,获取三级50秒。这好像就不能忍受了吧。
然后进行优化,代码如下,变成一次获取二级的数据,然后用C#代码来生成层级关系。

KB.DSN.BusinessAccess.District dictrictBll = new KB.DSN.BusinessAccess.District();
districtList = dictrictBll.GetEntityList(string.Format(" {0} {1}", Settings.Get_Top_And_Second_District_Where,
Settings.District_Order_By));
var top = from c in districtList
where c.DisFatherCode.Trim() == "0"
select c;
var second = from c in districtList
where c.DisFatherCode.Trim() != "0"
select c;
foreach (KB.DSN.Entity.District dis in top)
{
var se = from c in second
where c.DisFatherCode == dis.DisCode
select c;
dis.ChildrenDis = se as List<KB.DSN.Entity.District>;
}
return top as List<KB.DSN.Entity.District>;
组合的时候用到了LINQ的技术,好东西啊。推荐教程:LINQ体验系列文章导航
效率大增,变成了0.5和2秒,从无可救药变成可以忍受,甚至是可以接受了,很好。
结论
不应该多次往返数据库进行操作,每次都要连接数据库,然后关闭,造成很大的性能消耗,应该一次获取足量的数据,然后用C#代码来处理,这样会提升很多。当然了,获取多少也是很需求有关系的,不是一个固定规律。
后面的续集中还会讲到缓存的使用,文件依赖缓存,数据库依赖缓存等。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构