译完了提高Asp.Net应用程序的十大方法这篇文章,仔细想其中提到的每一条,在这里结合我的项目来谈谈.
第一条:返回多个结果集
因为我的项目中所有对数据库的访问的sql语句都是通过调用存储过程实现的,所以基本上都是用一个存储过程完成返回多个结果集,来得到自己想要的数据.满足!!
第二条:对数据进行分页
我写了一个通用的分页存储过程,用于对显示的数据进行分页,参照了原来Dino Esposito 的分页思想写的,写成了一篇项目总结发表在CSDN上.经过几个项目后,发现分页的效率取决于用于分页的条件,一般情况下,用索引字段的来作条件分页的效率是最高的,所以在以后的项目中,要注意分页的效率.查了一下csdn中的分页存储过程,"风云"的那个分页存储过程比较通用,而且效率也高.决定以后用它的那个了.
网址:http://community.csdn.net/Expert/topic/3587/3587201.xml?temp=.6331598
CREATE PROCEDURE sp_page
@tb
varchar(50), --表名
@col
varchar(50), --按该列来进行分页
@coltype
int,
--@col列的类型,0-数字类型,1-字符类型,2-日期时间类型
@orderby
bit,
--排序,0-顺序,1-倒序
@collist
varchar(800),--要查询出的字段列表,*表示全部字段
@pagesize int,
--每页记录数
@page
int,
--指定页
@condition varchar(800),--查询条件
@pages
int OUTPUT --总页数
AS
/*
功能描述:对指定表中满足条件的记录按指定列进行分页查询,分页可以顺序、倒序
查询可以指定页大小、指定查询任意页、指定输出字段列表,返回总页数
作
者:pbsql
版
本:1.10
最后修改:2004-11-29
*/
DECLARE @sql nvarchar(4000),@where1 varchar(800),@where2 varchar(800)
IF @condition is null or rtrim(@condition)=''
BEGIN--没有查询条件
SET @where1=' WHERE '
SET @where2=' '
END
ELSE
BEGIN--有查询条件
SET @where1=' WHERE ('+@condition+') AND '--本来有条件再加上此条件
SET @where2=' WHERE ('+@condition+') '--原本没有条件而加上此条件
END
SET @sql='SELECT @pages=CEILING((COUNT(*)+0.0)/'+CAST(@pagesize AS varchar)+
') FROM '+@tb+@where2
EXEC sp_executesql @sql,N'@pages int OUTPUT',@pages OUTPUT--计算总页数
IF @orderby=0
SET @sql='SELECT TOP '+CAST(@pagesize AS varchar)+' '+@collist+
' FROM (SELECT">'+@tb+@where1+@col+'>(SELECT MAX('+@col+') '+
' FROM (SELECT TOP '+CAST(@pagesize*(@page-1) AS varchar)+' '+
@col+' FROM '+@tb+@where2+'ORDER BY '+@col+') t) ORDER BY '+@col
ELSE
SET @sql='SELECT TOP '+CAST(@pagesize AS varchar)+' '+@collist+
' FROM '+@tb+@where1+@col+'<(SELECT MIN('+@col+') '+
' FROM (SELECT TOP '+CAST(@pagesize*(@page-1) AS varchar)+' '+
@col+' FROM '+@tb+@where2+'ORDER BY '+@col+' DESC) t) ORDER BY '+
@col+' DESC'
IF @page=1--第一页
SET @sql='SELECT TOP '+CAST(@pagesize AS varchar)+' '+@collist+' FROM '+@tb+
@where2+'ORDER BY '+@col+CASE @orderby WHEN 0 THEN '' ELSE ' DESC' END
EXEC(@sql)
GO
第三条:连接池
默认情况下,.NET是使用连接池来管理连接的.所以在项目上注意两点:一个是以构造一个类,专门用于返回连接字符串或连接对象,这样要以保证连接字符串是相同的,才能有效的利用连接池.另一个是用完连接后马上关闭边接.
第四,五,七条:充分利用Asp.Net中的各种缓存技术(文章的第四,第五,第七个方法都是用了缓存)
原来的项目中,用过一次页面输出缓存,但是没有成功,因为页面要提交,所以不能及时响应事件.就把它下掉了.开始以为是用缓存的问题.通过这篇文章,才知道是自己不知道怎么用.所以这段时间就在看有关怎么利用缓存的资料.应该好好的了解缓存的用法.这样,才能更有效的提高应用程序的效率.如果你也想了解缓存的技术,我找到了以下的几篇文章,它们都在Msdn中文网上:
ASP.NET 缓存:方法和最佳实践:
http://www.microsoft.com/china/MSDN/library/WebServices/ASP.NET/ASP.NETCaching-TechniquesandBestPractiCEs.mspx
在 ASP.NET 中支持数据库缓存相关性:
http://www.microsoft.com/china/msdn/library/webservices/asp.net/DbCacheDepASPNET.mspx
使用缓存,节省资金:
http://www.microsoft.com/china/msdn/library/webservices/asp.net/aspnetasp11022004.mspx
为 ASP.NET 创建缓存配置对象:
http://www.microsoft.com/china/MSDN/library/WebServices/ASP.NET/CreatingaCacheConfigurationObjectforASPNET.mspx
还有一本微软的蓝皮书:
Improving .NET Application Performance and Scalability
应该说这一本书是最全,最好的指南了.第六章有一节专门讲缓存及缓存应用指南的.正在看这一章.
第六条:在后台处理
这是我接触到的一个新的解决方案,原来asp.net中也可以作后台的定时触发功能.以后肯定能用上.上面列出的
使用缓存,节省资金:
http://www.microsoft.com/china/msdn/library/webservices/asp.net/aspnetasp11022004.mspx
这篇文章就使用了这一种技术,很有参考价值.
第八,九条:用IIS6的新功能
原来一直没有注意IIS6,都是用IIS5,看来服务器应该升级了.
第十条:有条件的使用ViewState
一直都没注意ViewState,看来以后只要没有必须使用ViewState的时候就要把它关掉,特别是用到了DataGrid的页面.
总的看来,其中用Cache能更好的提高应用程序的性能,如果用到数据库,记得要充分利用连接池,高效率的分页;如果用的是windows 2003就不要忘了开它的Kernel Caching.最后也不要忘了关不用ViewState的页面或控件的EnableViewState属性.