130 likes | 288 Views
ASP.Net 性能优化. ChengDu MIS Jin.J.Qin. 议 程. 1. 会话状态的恰当选择 2.Viewstate 优化 3.Cache 优化 4. 控件优化与选择 5. 返回多个记录集 6. 数据分页优化 7.Ado.Net 对象选择 8. 数据前绑定 9. 存储过程优化, C # Coding 优化. 1. 会话状态的恰当选择. StateServer :表示状态服务在一台名为 myserver 的机器的 42424 端口(默认端口)运行。
E N D
ASP.Net 性能优化 ChengDu MIS Jin.J.Qin
议 程 • 1.会话状态的恰当选择 • 2.Viewstate优化 • 3.Cache优化 • 4.控件优化与选择 • 5.返回多个记录集 • 6.数据分页优化 • 7.Ado.Net对象选择 • 8.数据前绑定 • 9.存储过程优化,C# Coding优化
1.会话状态的恰当选择 StateServer :表示状态服务在一台名为myserver的机器的42424端口(默认端口)运行。 要在服务器上改变端口,可编辑HKLM\SYSTEM\CurrentControlSet\Services\aspnet_state注册表项中的Port值。 • ASP.NET通过将会话状态信息存储在进程、状态服务器或SQL Server数据库中来解决这个问题。 • <sessionState mode="InProc" cookieless="true" timeout="20"/> • <sessionState mode="StateServer" stateConnectionString="tcpip=myserver:42424" cookieless="false" timeout="20" /> • <sessionState mode="sqlserver" sqlConnectionString="data source=127.0.0.1; userid=sa; password=" cookieless="false" timeout="20" /> 管理员需要创建ASPState数据库,方法是运行 WinDir\Microsoft.Net\Framework\Version文件夹中的InstallState.sql脚本。 要配置SQL服务器,可以在命令行中运行SQL Server 提供的命令行工具osql.exe osql -S [ server name] -U [user] -P [password] InstallSqlState.sql
2.Viewstate优化 定义:保持页面或控件状态的视图对象。 --使用ViewState ,每个对象都必须先序列化到 ViewState 中,回传时再进行反序列化,因此使用 ViewState是有代价的。 • ViewState是什么 • 什么地方可以不需要ViewState • (1)页面控件 (.ascx) • (2)页面不回传给自身。 • (3)无需对控件的事件处理。 • (4)控件没有动态的或数据绑定的属性值 • 如何禁用ViewState • 单个页面:<%@ Page EnableViewState="False" %> • 每个页面:在 web.config 中 <Pages EnableViewState="false" /> • 控件:ViewState属性
3.Cache优化 • 缓存简介 • 页面缓存 • 页面整体缓存 • 局部页面缓存 • 数据缓存
3.Cache优化 • private Cache _cache; • 插入Cache: • _cache.Insert(key, obj, dep, DateTime.Now.AddSeconds(), TimeSpan.Zero, priority, null); • 移除Cache: • _cache.Remove(key); • 获取Cache中对象 • object ocache=_cache[key]; • Cache清除: • IDictionaryEnumerator enumerator = _cache.GetEnumerator(); • while (enumerator.MoveNext()) • { • _cache.Remove(enumerator.Key.ToString()); • } //从上下文中读缓存项 datatable newstb = HttpContext.Current.Items[cacheKey] as datatable ; if (newstb == null) { //从HttpRuntime.Cache读缓存项 newstb = SiteCache.Get(cacheKey) as datatable ; if (newstb == null) { //直接从数据库从读取 …….. //并将结果缓存到HttpRuntime.Cache中 _cache.Insert(cacheKey, newsSet, 60, CacheItemPriority.Normal); } • System.Web.Caching :Cache • Cache的使用 • 注意事项: • Cache即时更新 • Cache时限 • 指定文件或目录变更,则原Cache项不可用 • 使用顺序注意项
4.控件优化与选择 DataGrid:自带最强大的数据显示控件,虽然使用方便了,HTML冗余代码多,性能开销大。,如果你想尽量基于Web标准开发,请抛弃它。 DataList:比DataGrid功能少了很多。但自定义性强,特有的多行数据显示。DataGrid能实现的功能,它基本能实现。所以建议使用它。 Repeater:功能最少,但自定义性强,开销最小。如果只需对数据显示,建议使用。 (1)如果html控件达不到所要实现的功能,而且和一些脚本语言(如javascrpt/vbscript)结合也不能实现的话,才会选择服务器控件。 (2)对于不需要服务器处理事件的控件,尽量选择html控件 (3)选择服务器控件后,也尽量对其控件优化,如取消一些页面状态等(参见前面的Viewstate) • Html控件和服务器控件的选择。 • 数据控件选择优先顺序:Repeater、DataList、DataGrid • Ispostpack • 默认false.需要产生事件的时候才需设置为true,否者回发即耗资源,用户体验又差 • 顺便提一下Ajax:优点,缺点
5.返回多个记录集 • 不要期望GC会在你想象的时间内关掉连接,虽然最终都要销毁对象和关闭边接,尽量减少链接池。 • 在单个数据库请求中返回多个结果集,可以减少与数据库通信的时间,使你的系统具有扩展性,也可以减少数据库服务器响应请求的工作量。 • 根据情况将部分业务处理放在SP中(如表间操作非常频繁而业务本身较简单),减少数据库链接、访问次数。 • 对数据的更新不需要返回结果集,建议使用ExecuteNonQuery • 单个值的查询使用ExecuteScalar
6.数据分页优化 • Datagrid,又见Datagrid • 在web开发中,分页有两种方式: • (1)将全部数据取出再分页 • (2)只取你想要页的数据。 • DataGrid自带分页是第一种方式,在数据记录数不多时,可使用,简便。 • 如果数据记录过大,比如10W条记录,每页100条,采用第一中方式是否明智?编写分页存储过程取数据是必要的,但是相对开发成本高。
7.Ado.Net对象选择 • 神通广大的DataSet • 独立好用的DataTable • 快速简单的DataView • 飞速但不断奶的DataReader
8.数据前绑定 • <%# DataBinder.Eval(Container.DataItem, "字段名") %> • 用DataBinder.eval 绑定不必关心数据来源(Dataread或dataset)。不必关心数据的类型eval会把这个数据对象转换为一个字符串。在底层绑定做了很多工作,使用了反射性能。正因为使用方便了,但却影响了数据性能。 • <%#ctype(Container.DataItem,DataRowView).Row("字段名") %> • 当于dataset绑定时,DataItem其实式一个DataRowView(如果绑定的是一个数据读取器(dataread)它就是一个IdataRecord。)因此直接转换成DataRowView的话,将会给性能带来很大提升。 • 1.需在页面添加<%@ Import namespace="System.Data"%>. • 2.注意字段名的大小写(要特别注意)。
9.存储过程优化,C# Coding优化 • 参加其它Training • 没有最好,只有更好
~Q & A~ THANKS! HA~HA~