议程
错误类型以及处理方式
提高数据访问性能
服务器控件的使用
缓存的使用
提高性能的实用技巧
错误类型以及处理方式
错误的类型
分析程序错误
–语法错误语法有问题
–逻辑错误除错误类型不匹配不正确输出
使用不正确的对象处理无效的数据
编译错误使用了不能被语言编译器识别
但ASPNET能识别的关键字或语句时发生的
错误
运行时错误
配置错误nfig文件出错
错误的处理
使用验证控件
编程处理
–校验语句
校验(checked)和非校验(unchecked)语句
–trycatchfinallytry{block}catch(FormatException){responsewrite(格式错误);}catch(OverflowException ){responsewrite(溢出);}catch(Exception ex){exMessageToString();}
一些常用的引发异常:
FormatException 当参数格式不符合调用的方法的参数规范时引发的异常
ArithmeticException 因算术运算类型转换或转换操作中的错误而引发的异常
OverflowException (继承ArithmeticException )在选中的上下文中所进行的算术运算类型转换或转换操作导致溢出时引发的异常
DivideByZeroException (继承ArithmeticException )试图用零除整数值或十进制数值时引发的异常
–Page_Error
Page对象的Error事件
使用模板
void Page_Error(object senderEventArgse){ResponseWrite(发生错误:+ServerGetLastError()ToString());ServerClearError();}–Application_Error 在应用程序配置文件中为应用程序执行的声明性错误处理Appliation对象的Error事件应用程序中任何页面抛出异常都会调用在globalasax中形式为void Application_Error(object senderEventArgse){ }
DEMO
编写到windows错误日志
把错误发送邮件到管理员
利用配置文件处理错误
ASPNET同以前的ASP一样当服务器上发生了一个运
行时间或编译时间错误时就会生成一个html 错误页面
但是与ASP不同ASPNET格外关注的是要确保在默
认状态下不会因为这个错误的发生而洩露安全信息
<systemweb><customErrorsdefaultRedirect=urlmode=RemoteOnly><errorstatusCode=coderedirect=url></error></customErrors></systemweb>
议程
错误类型以及处理方式
提高数据访问性能
服务器控件的使用
缓存的使用
提高性能的实用技巧
性能引言
是
–XmlDocumentLoadXML(stringstrFileID) // 加
载XML
–boolCheckIDExisit(stringstrFileIDstringstrID)
//判断节点是否存在
还是
–boolCheckIDExisitByXml(string strXmlstringstrID) //判断节点是否存在
–或boolCheckIDExisitByXml(XmlDocumentobjXmlstringstrID) // 判断节点是否存在
逻辑设计
建议: 采用层逻辑模型
– Pages (aspx) and User Controls (ascx) UI
– Business and Data Access classes in \bin dir
– Data within a SQL Database via SPROCs
使用最佳的Data Provider
ADONET 可支持多个Provider
–SystemDataSqlClient
–SystemDataOracleClient
–SystemDataOleDb
–SystemDataOdbc
所有Provider的编程模型相同
–但是性能方面存在明显差异
建议使用最佳Provider
–在访问MSDE/SQL 时始终使用SqlClient
–在访问Oracle 时始终使用OracleClient
Data Provider测试
方案
–从SQL Northwinds 数据库中抽取 行
–<%= %> html 表格格式化技术
衡量的三种技术(不同的Data Provider )
–传统ASP/ADO
–ASPNET w/ SystemDataOleDb 提供商
–ASPNET w/ SystemDataSqlClient 提供商
传统 ASP/ ADO 带 OLEDB 的
ASPNET
带 SQL 的 ASPNET
请求/秒(P 服务)
数据性能测试
DataReaders 和DataSets
DataReader
–对查询的结果提供了单向读取的操作
–轻量快速–但在Reader为关闭之前始终处于连接状态
DataSet
–非链接的数据访问方式
–内部使用DataReader用于获取数据
–在完成DataSet的获取后会自动关闭DataReader
如何选择?
–依赖于您的应用
–般情况下读取大量数据对返回数据不做大量处理用
SqlDataReader对返回数据大量处理用datset比较合
DataReader ?DataSet
通常情况下DataReader比
DataSet快%!!
ExecuteNonQuery和ExecuteScalar
ExecuteNonQuery
–对数据的更新不需要返回结果集
–由于不返回结果集可省掉网络数据传输它仅仅返回受影响
的行数如果只需更新数据用ExecuteNonQuery性能的开销
比较小
ExecuteScalar
–它只返回结果集中第一行的第一列使用ExecuteScalar 方
法从数据库中检索单个值(例如id号)
–与使用ExecuteReader 方法返回的数据执行生成单个值所
需的操作相比此操作需要的代码较少
如何选择?
–只需更新数据用ExecuteNonQuery单个值的查询使用
ExecuteScalar
数据的绑定DataBinder
一般的绑定方法<%#
DataBinderEval(ContainerDataItem 字段名)
%>用DataBindereval 绑定不必关心数据来源
(Dataread或dataset)不必关心数据的类型eval
会把这个数据对象转换为一个字符串在底层绑
定做了很多工作使用了反射性能正因为使用
方便了但却影响了数据性能
直接转换成DataRowView的话将会给性能带来
很大提升
<@% ((DataRowView)ContainerDataItem)[字
段名] %>
连接池
ADONET 拥有内置的连接池
–自动缓存/重新使用连接
–不必为此编写任何代码
代码建议
–在后期打开代码中的连接然后在早期将其
关闭
–切勿长时间保持连接状态
–完成后应立即显示地关闭数据库连接以将其返
回至池中
连接池
优化提示
–不同的连接字符串可以生成多个不同的连接池
–在WebConfig 中存储单个连接字符串
–使用ConfigurationSettingsAppSettings以在运
行时采用编程形式对其进行访问
始终应明确关闭数据连接避免连接洩漏
–否则连接将在下一次垃圾收集之前保持打开状态
–洩露连接会显着降低性能
使用存储过程
建议将SPROC 用于数据存取
–通过DBA 进行更轻松的性能调试
–通过使用数据库事务处理避免出现分布事务成本
–有助于防止SQL 注入攻击
–有助于消除应用与数据库反复调用的成本
有趣的提示
–可以通过企业管理器来关闭动态SQL 支持以强制使用
SPROC
DEMO
使用连接池优化程序
议程
错误类型以及处理方式
提高数据访问性能
服务器控件的使用
缓存的使用
提高性能的实用技巧
服务器控件
提供了清晰的编程模型(重用简洁宜用)
–创建ASPNET 页面所倡导的模式
对性能优化而言有两点需要注意:
–ViewState
–控件数量
ViewState 管理
ASPNET controls 能够维护页面Control元素的状态
– 状态以viewstate hidden field进行传递
负面影响:
– 增加网络负荷(both on render and postback)
– 额外的服务器性能消耗(serialize values to/from viewstate)
Viewstate灵活性:
– 页面级(Can disable viewstateentirely for a page )
– 控件级(Can disable viewstateusage on a per control basis )
建议:
– 认真审核该功能的使用
– 若不使用PostBack功能请在页面级屏蔽ViewState
– PostBack时每次都重新生成控件请对控件级的ViewState屏蔽
– 使用<%@ Page Trace=true %>跟蹤ViewState的大小
有关ViewState管理提示
如果您希望更明确的限制viewstate 的使用可将
ASPNET 配置为默认情况下处于关闭状态
nfig
<configuration>
<systemweb>
<pages enableViewState=false/>
</systemweb>
</configuration>
之后需要viewstate 的页将在页面指令中手动对其进
行设置
–<%@ Page EnableViewState=true%>
生成的控件数量
页面上的每个服务器控件的生成都存在固定的
成本
–每个控件的成本通常可以忽略不计
复合控件有时可以屏蔽使用的控件数量尽管
会出现以下情况
–聚集成本有时可以累加
–打开ASPNET Trace即可查看实际计数
议程
错误类型以及处理方式
提高数据访问性能
服务器控件的使用
使用缓存进行程序优化
提高性能的实用技巧
缓存技术
什么是缓存技术?
缓存是计算机快速地再次获得数据地方式
缓存原理
将经常访问地数据存储到计算机可以更快
更容易地读取地位置
ASPNET中缓存的位置
客户端缓存
客户
服务器
①从服务器读取数据
②缓存到硬盘
③以后访问读取
硬盘数据
服务器缓存
服务器 ASPNET 引擎
ASPNET 引擎
客户
③随后的请求直接
从缓存中取数据
①从ASPNET 中发送数据
②缓存数据
什么时候用缓存?
不要缓存用户随时都会
修改的对象如购物车
不要缓存包含时间的页
面
缓存整个应用程序都要
使用的设置或对象(但
这些设置和对象必须在
其生存期内不变化)
不要缓存个人信息以
防止别人盗用
缓存那些经常被访问
并且变化不大的数据
不应该使用缓存的情况使用缓存的情况
如何使用缓存?
ASPNET有两种用于WEB应用的缓沖技术输
出缓沖和数据缓沖
–输出缓沖指把一次请求所产生的动态输出保存于内
存中
–数据缓沖指按照一定的策略把事先不确定的对象保
存于内存中
输出缓存的使用
–使用@OutputCache指令
–例如(添加在页头)
<%@ OutputCacheDuration= VaryByParam=None%>
DEMO
输出缓存练习
数据缓存
ASPNET提供了一个相当出色的缓存引擎
机制它允许页面保存和索引HTTP请求所
要求的各种各样的对象ASPNET的缓存
对各个应用来说是私有的是存储各种对
象的存储器缓存的生存周期取决于应用
的生存周期也就是说当应用重新启动
时缓存实际上也已重建
数据缓沖
–使用(类似于Session变量的使用)
Cache[userName] = MeMe;
ResponseWrite(Cache(userName));
–注意不能通过下标访问缓存中的变量如
ResponseWrite(Cache[]);是错误的
–缓存的删除
CacheRemove(userName);
使用缓存依存关系
–缓存变量的添加
CacheAdd()
CacheInsert()
它们功能相同但Insert更加灵活一些
–Insert
(keyvaluedependenciesabsoluteExpiration
slidingExpirationprioritypriorityDecayonRem
oveCallBack)
缓存替换策略
腐烂搜索(Scavenging)
当内存变得比教紧张时缓存机制会找出最
不常用和最不重要的对象把它从内存中移
出以减轻系统压力
到期控制(Expiration)
编程者可以指定缓存对象的生存周期这种
指定的时间可以是绝对的也可以是相对的
文件和键值依赖
从外部文件或者是其他缓存键值是否改变
来决定本身键值是否有效
DEMO
数据缓存
议程
错误类型以及处理方式
提高数据访问性能
服务器控件的使用
使用缓存进行程序优化
提高性能的实用技巧
提高性能的实用技巧
不要使用不必要的Session和ASP中一样
在不必要的时候不要使用Session
不使用不必要的Server Control
不使用不必要的ViewState
不要用Exception控制程序流程
禁用VB和Jscript动态数据类型
使用存储过程完成数据访问
只读数据访问不要使用DataSet
关闭ASPNET的Debug模式
使用ASPNetOutput Cache 缓沖数据
提高性能的实用技巧
尽量用SQL返回DataGrid需要绑定的DataSet尽量不
要对DataSet进行二次加工特别不要对DataSet进
行大量删除实践证明这很慢不如复制部分数据
尽量把查询数据的数据库操作次数压缩到最少尽量
次数据库操作就可完成
注意优化数据库查询操作
不要在页面加载时默认选择全部数据尽管可以方便
后续操作但用户会以为还没有操作就这么慢
建议尽量用比较高效的SQL代替后续复杂的DataSet
二次加工
提高性能的实用技巧
仅在需要的时候打开数据库连接
一旦数据库操作完毕一定关闭连接
在关闭连接时记得删除临时对象
在关闭连接前确保关闭任何用户定义事务
显示非交互性数据使用SQLDataReader可以获得
最佳性能
注意共享那些经过复杂处理或漫长查询才得到的数据
在页面跳转时记得终止当前页面的处理
有大量连接的字符串操作不要使用+改用
StringBuilder