- 1、本文档共4页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
在进行了一段时间的调研后,本周开始着手进行性能优化工作。现在在优化工作工作之前,我总结一下调研了的一些信息。
1.景
03年的时候开发的系统了,所以使用的是.NET 1.1+SQL Server 2000,操作系统用的是Windows2003,使用了这么几年,只是对操作系统进行了升级(从当时的Windows2000升级到2003的)以及对 系统进行维护,.Net环境和数据库并没有改变。由于系统中记录了几年的数据,有些表有几百万行的数据,当初没有建立索引和系统程序上考虑的不足造成目前 系统运行十分缓慢,需要进行性能优化。我现在都开始用VS2008开发和使用SQL Server 2008数据库了,突然接收这样一个老项目,还真有点不适应,SQL2000我好久没有碰过了。
2.件
Web服务器和数据库服务器各一台,都是4个双核CPU、8G内存、1G网络、300G的RAID5硬 盘,总体来说感觉很好了。在得知客户是8G的内存时我第一反应就是客户肯定浪费内存了!结果实际一看,果然如此,系统是8G的内存,但是所有程序加起来用 的内存才2G左右,而且一直上不去,为什么呢?因为客户使用的是32位的操作系统,所以默认只能支持4G的内存,有2G用于操作系统,另外2G用于应用程 序,在任务管理器中可以看到SQL Server只占用了1.7G左右的内存,而不能再占用更多就是这样一个原因。SQL Server是一个做大量数据处理的程序,内存的速度比硬盘快很多,若要处理的数据如果都是在内存中将会比读取硬盘进行处理快的多,所以SQL Server占用的内存越多越好。要突破32位操作系统对应用程序2G的内存限制,可以打开3GB开关,将操作系统的内存使用改为1G,应用程序使用的内 存改为3G。当然这里是8G的内存,所以打开3GB开关是不够的,这里就需要打开系统的APE开关,使用SQL Server的AWE功能。另外一种解决办法就是换成64位的操作系统和SQL Server。
3.问
Review了一下程序代码,该系统是BS程序,三层架构,数据库访问主要是采用SqlHelper调用存储过程和SQL语句,然后使用 DataReader最终返回一个对象或对象集合。由于系统是在不断的需求变化中完成了,所以也犯了很多项目的一个通病,为了赶时间,大家就不顾代码的规 范和架构,有的是使用存储过程,有的是使用SQL语句,有的是直接在UI层写SQL语句,然后将SQL语句传到业务层,最后再传到数据层去执行。我已经不 是第一次看到这样的程序了,我大学实习时开始做的一个项目中也出现过这样的代码,所以感觉可以理解。
Review数据访问层的代码时,我看到了大量的读取一个DataReader用于填充一个对象的代码如下:
private void fillRegionLevel(RegionLevelMod level, SqlDataReader reader)??????? {??????????? // ??????????? if (!reader.IsDBNull(0))??????????????? level.LevelCode =? reader.GetString(0);??????????? // 行政级别名称??????????? if (!reader.IsDBNull(1))??????????????? level.LevelName = reader.GetString(1);??????????? // 行政级别描述??????????? if (!reader.IsDBNull(2))??????????????? level.LevelDescribe = reader.GetString(2);??????? }
这样写程序也不会有什么错误,但是整个程序太依赖数据库返回对象的顺序了,如果修改了数据库,在最前面多提供了一列,那么 reader.GetString(0)就会错位读取到其他的列,以后的读取也全部错位,所以扩展相对比较麻烦。我个人比较建议的写法是通过列名来读取 DataReader中的内容,比如:
if (Convert.IsDBNull(reader[Code]))??????????? {??????????????? level.LevelCode = reader[Code].ToString();??????????? }
当然其实并不需要这么麻烦,在项目中如果通过DataReader填充一个对象的话,我一般采用反射的方式,在实体类定义的时候就为每个字段添加 Attribute,然后统一使用一个方法通过反射方式就可以将类中的字段与DataReader返回的列进行映射了。
还有一个问题就是对于字典表(比
文档评论(0)