`

.NET应用访问数据库之数据库的开销问题

阅读更多

 

  拿今天的一个例子说话吧,那就表中存放的是全国的地域信息,表结构如下:

   首先用代码生成器和存储过程生成器生成基本表的操作,推荐两个工具:动软.Net代码生成器- 全功能的三层架构.Net代码生成器和codeplex上面的一个存储过程生成工具Stored Procedure Generator (for SQL Server 2000/2005 ... 。

  现在提供了一个方法,可以获取顶级和二级地域的信息,最开始的做法是先获取顶级的地域信息,然后循环顶级地域信息,获取它的子节点。

  

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->List<KB.DSN.Entity.District> topDistrictList = new List<KB.DSN.Entity.District>();
            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#代码来生成层级关系。

  

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->            List<KB.DSN.Entity.District> districtList = new List<KB.DSN.Entity.District>();
            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#代码来处理,这样会提升很多。当然了,获取多少也是很需求有关系的,不是一个固定规律。

  后面的续集中还会讲到缓存的使用,文件依赖缓存,数据库依赖缓存等。

分享到:
评论

相关推荐

    ado[1].net中文手册 学习 ado.net的重要资料

    通过 ADO.NET 访问数据 ADO.NET 概述 ADO.NET 的设计目标:讨论创建 ADO.NET 的动机和设计目标。...由于所有 ADO.NET 应用程序都使用对数据的不连接访问,因此它不会在较长持续时间内保留数据库锁或活动数据库连接。

    asp.net下SQLite(轻量级最佳数据库) 原理分析和开发应用

    概述 SQLite介绍 自几十年前出现的商业应用程序以来,数据库就成为软件应用程序的主要组成部分。... Richard Hipp发布,它的减少应用程序管理数据的开销,SQLite可移植性好,很容易使用,很小,高效而且可靠。 SQLite

    ADO.NET连接池示例

    因为打开和关闭数据库连接开销比较大,所以连接池对于与数据库链接资源的控制上,加快客户端程序的效率都有很大地帮助。 示例中会看到如何控制连接池个数,链接对象关闭连接放回链接池中,有其他连接对象打开连接时...

    asp.net社区交流系统VS开发sqlserver数据库web结构c#编程计算机网页源码项目

    asp.net 社区交流系统 是一套完善的web设计管理系统,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为vs2010,数据库为sqlserver2008,或者以上版本,使用c#语言开发。 二、功能介绍 网络社交...

    MySQL 精选 60 道面试题(含答案)

    数据更新的开销比较小。 支持复杂查询(带 where 子句的查询) 非关系型数据库(NOSQL)的优点 无需经过 SQL 层的解析,读写效率高。 基于键值对,读写性能很高,易于扩展 可以支持多种类型数据的存储,如图片,...

    解决大数据组所需要的业务数据之Java.zip

    本项目主要是为了解决大数据组所需要的业务数据。...Canel 监听 MySQL 的 Binlog 对于直接访问数据库来说,开销相对较小。 详细介绍参考:https://blog.csdn.net/sheziqiong/article/details/132443068

    UltraLiteDB:在Unity的单个数据库文件中的准C#.NET键值存储

    UltraLiteDB-单个数据库文件中的准C#.NET键值存储,旨在在Unity中使用 UltraLiteDB是LiteDB 4.0的精简版本... 线程和文件锁定开销已消除,必须从单个线程访问数据库,这在Unity中应该不是问题。 文件存储和流媒体已

    支持.Net和.Net Core的网站框架ZKWeb.zip

    主要功能.Net Core支持支持运行在.Net Framework和.Net Core上插件系统使用Roslyn支持动态加载插件支持修改插件源代码后自动重新编译和加载模板系统使用DotLiquid支持Django风格的模板重载支持手机版专用模板(优先...

    在Android上使用OrmLite数据库框架的Demo

    引用:“OrmLite提供了一些轻量级持久化Java对象到SQL数据库,同时也避免了复杂性和更多的标准的ORM包的开销功能。它支持的SQL数据库使用JDBC的数量,还支持原生的Android操作系统数据库API调用sqlite。” 使用方法...

    SQL Server 2008 查询性能优化 part1

    内容涵盖了数据库应用系统中各种性能瓶颈的表现形式及其发生的根源和解决方法,从硬件瓶颈到查询、索引设计以及数据库管理等,贯穿了数据库系统知识的各个方面。最后以一个实际的工作负载将所有技巧联系起来,并且...

    SQL Server 2008 查询性能优化 part2

    内容涵盖了数据库应用系统中各种性能瓶颈的表现形式及其发生的根源和解决方法,从硬件瓶颈到查询、索引设计以及数据库管理等,贯穿了数据库系统知识的各个方面。最后以一个实际的工作负载将所有技巧联系起来,并且...

    JDiy开发框架与javaWeb建站平台v1.0

    您可以将JDiy应用于javaWeb/javaEE开发环境中,JDiy内置多WEB应用程序统一管理程序,数据库连接池配置、自动销毁空闲的JDiy应用程序上下文等,在javaWeb应用中将大大的节省您的服务器内存资源开销,有了JDiy,您无需...

    ibm_mtk_V2_win.rar

    MTK 向数据库管理员(DBA)和应用程序程序员提供了使迁移任务自动化所需要的工具,而以前这些任务不但效率低下而且开销巨大。通过使用 MTK 中的以下特性,您可以减少停机时间、消除人为错误,以及降低人工和与传统...

    毕业设计-基于Topshelf及Nancy构建的自托管Web小型客户信息管理平台(源代码+说明)

    在要部署时,Topshelf会将应用程序作为Windows服务自动处理它的安装和启动(完全免去了处理InstallUtil 的开销);自动处理服务项目和服务组件的细微差别;以及在出错时将调试器附加到服务。Topshelf还允许在代码中...

    ASP.NET性能优化八条建议

    1、数据库访问性能优化 A、尽量减少数据库连接,并充分利用每次数据库连接:连接的创建、打开和关闭是有开销的。可以使用连接池 B、合理使用存储过程:存储过程是存储在服务器端的一组预编译的SQL。使用存储过程可以...

    个人理财信息系统课程设计(论文+源码)

    投资理财就是做好人生规划,合理安排你的金钱。...本程序的开发环境为VS2010,所用的数据库为sql server2008,采用的技术为ASP.Net,编写的语言为C#,软件架构为经典的三层B/S架构。它将带给用户直观实用的体验。

    二十三种设计模式【PDF版】

    需要将 J2EE 用对地方,那么只有理解 J2EE 此类框架软件的精髓,那么你才能真正灵活应用 Java 解决你的问题,甚至构架出你自 己企业的框架来。(我们不能总是使用别人设定好的框架,为什么不能有我们自己的框架?) ...

    vRP:FiveM(http:fivem.net)RP addonframework

    特征基本管理工具(踢,禁令,白名单),组/权限,语言,标识系统(用于数据库存储的永久用户ID),用户/字符/服务器/全局自定义数据键/值玩家状态(生存要素,武器,玩家外观,位置) 玩家身份/电话/态度(教育/...

    飞凌酷网新闻文章评论系统 v0.8 经典学习版.rar

    本程序是开源软件,以交流学习为主,很多封装的方法都是非常不错的,无论是.net新手还是专业从事.net开发者,都值得一看。 评论界面采用QQ新闻评论,简洁大方。程序代码本身不大,但采用了纯真IP数据库,所以压缩后...

Global site tag (gtag.js) - Google Analytics