如何优化ASP.NET网站的性能?有哪些可行方法

zkvistor 2009-09-05 10:18:05
加精
用.NET写了一个电子商务网站,但是性能却不尽人意 ,问一下如何优化.NET网站的性能,例如:提高访问速度,加强安全性,防止SQL注入等等。。。。。大家有什么好的优化方法尽量提出来 像vancl http://www.vancl.com/,京东
http://www.360buy.com/ 等等都算是.NET版本B2C网站的典范,CSDN也相当不错,
...全文
4540 185 打赏 收藏 转发到动态 举报
写回复
用AI写文章
185 条回复
切换为时间正序
请发表友善的回复…
发表回复
NigelLiang 2011-12-15
  • 打赏
  • 举报
回复
支持一下,我个人觉得配置很重要
wsjrzjp 2011-11-22
  • 打赏
  • 举报
回复
服务器一定要好
qianjin110 2010-01-23
  • 打赏
  • 举报
回复
挺好的
zkvistor 2009-11-08
  • 打赏
  • 举报
回复
sunchen891229 2009-11-07
  • 打赏
  • 举报
回复
好复杂,多学习学习!!!
白云任去留 2009-11-07
  • 打赏
  • 举报
回复
Up..
zkvistor 2009-10-10
  • 打赏
  • 举报
回复
我把GridView等控件全部换成了Repeater,Repeater和DataList有点像,二者性能相比谁更好些, 使用Repeater控件的时候有哪些优化的方法?
zkvistor 2009-09-23
  • 打赏
  • 举报
回复
46539492 谢谢你的解答,如果方便的话 能不能把你之前写的数据访问层代码发我一份我想学习一下,
邮箱是zkarron@qq.com

大家有空看看这个 http://topic.csdn.net/u/20090922/18/f044684e-ad17-45a8-a8bf-e560d5b3fcca.html?seed=587289733&r=59998432#r_59998432

zkvistor 2009-09-23
  • 打赏
  • 举报
回复
[Quote=引用 168 楼 46539492 的回复:]
引用 166 楼 zkvistor 的回复:
帖子加不了分,以后另开贴散分,还有个问题 ,页面有个批量修改订的功能,数据达到1K条以上 速度就慢了,我用的是把Excel表格里的数据读取到DataSet里,然后循环遍历DataSet进行修改,不知道各位有没有好的方法?另外Repeater控件相比DataGrid和GridView访问速度要快些么?

这种操作本身就很耗时,所以尽量不要提供给用户操作,要么就限制操作的数据数。至于提高效率,可以尝试拼sql,一次执行,比如:
SQL codedeclare@tempTabtable(useridint)insertinto@tempTabselect2unionallselect3unionallselect4
Repeater确实是最快的,很明显,因为封装的东西少。
[/Quote]

批量修改是网站后台操作的
zkvistor 2009-09-23
  • 打赏
  • 举报
回复
[Quote=引用 173 楼 skyland84 的回复:]
既然又看到这帖子了

那就在补充一下:

最耗性能:

在数据库链接时,以及处理后是否都人为的关闭连接?

还有别太依赖 内部的垃圾回收机制。能自己释放的东西就手动释放。

在进行IO处理时最好是使用using()。

session 别用太多,越多越慢,尽量别超过两个session。虽然用这个很方便,如果COOKIE能做的就别用Session来做。

一个页面的处理最好是连接一次数据库也就OK了,别取多少次就连接断开几次,链接数据库可是很好性能的。

好了.暂时就说这些。
[/Quote]
session全部已改为 cookie 了, 暂时还没涉及到IO的处理,不过数据的处理特别是查询 用到的是SQLHelp帮助类,里面全部都是用到了using
如:
using(SqlDataReader rdr=SqlHelp.ExecuteReader(.......))
{
.......
}

这样在每次取玩数据后会自己关闭连接

至于垃圾回收机制这个到没有人为手动去释放
展工匠 2009-09-23
  • 打赏
  • 举报
回复

兄弟有没有.NET网站IIS配置方面的教程的啊!急求
QQ:914419154
skyland84 2009-09-23
  • 打赏
  • 举报
回复
既然又看到这帖子了

那就在补充一下:

最耗性能:

在数据库链接时,以及处理后是否都人为的关闭连接?

还有别太依赖 内部的垃圾回收机制。能自己释放的东西就手动释放。

在进行IO处理时最好是使用using()。

session 别用太多,越多越慢,尽量别超过两个session。虽然用这个很方便,如果COOKIE能做的就别用Session来做。

一个页面的处理最好是连接一次数据库也就OK了,别取多少次就连接断开几次,链接数据库可是很好性能的。

好了.暂时就说这些。
zkvistor 2009-09-22
  • 打赏
  • 举报
回复
经过男儿当自强的指点 更改后的SQLServerDAL层代码如下:


using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System .Data .SqlClient;
using B2C.Model.B2CShop;
using B2C.IDAL.B2CShop;
using B2C .DBUtility.B2CShop;
namespace B2C .SQLServerDAL.B2CShop
{
public class Venshop_sub:IVenshop_sub
{
private static string Search_Sub_BySubName="select sub_id,sub_name,sub_date,sub_fadate,sub_number,sub_zt,sub_ps,sub_pay,sub_totime,sub_fapiao,sub_quehuo,sub_to,sub_mail,sub_tel,sub_adds,sub_post,user_mt,sub_from,sub_frommail,sub_fromtel,sub_fromadds,sub_frompost,sub_other,sub_k,sub_h,jbm from venshop_sub where sub_number=@sub_number";
private static string Search_Sub_ByUserName = "select sub_id,sub_name,sub_date,sub_fadate,sub_number,sub_zt,sub_ps,sub_pay,sub_totime,sub_fapiao,sub_quehuo,sub_to,sub_mail,sub_tel,sub_adds,sub_post,user_mt,sub_from,sub_frommail,sub_fromtel,sub_fromadds,sub_frompost,sub_other,sub_k,sub_h,jbm from venshop_sub where sub_name=@sub_name";
private static string Delete_Sub_BySubNumber = "delete from venshop_sub where sub_number=@sub_number";
private static string Insert_Sub="insert into venshop_sub(sub_name,sub_date,sub_number,sub_zt,sub_ps,sub_pay,sub_totime,sub_quehuo,sub_other,sub_to,sub_mail,sub_tel,sub_adds,sub_post,user_mt,sub_from,sub_frommail,sub_fromtel,sub_fromadds,sub_frompost,sub_k,sub_h,jbm)values(@sub_name,@sub_date,@sub_number,@sub_zt,@sub_shway,@sub_zhifu,@sub_shtime,@sub_quehuo,@sub_other,@sub_to,@sub_mail,@sub_tel,@sub_address,@sub_post,@sub_mt,@sub_from,@sub_fromMail,@sub_fromTel,@sub_fromAddress,@sub_fromPost,@sub_k,@sub_h,@jbm)";
/// <summary>
/// 添加订单
/// </summary>
/// <param name="hw"></param>
public bool InsertSub(Venshop_subInfo subInfo)
{
bool flag;
SqlParameter[] param = new SqlParameter[]{
new SqlParameter("@sub_name",SqlDbType.VarChar),
new SqlParameter("@sub_date",SqlDbType.DateTime,8),
new SqlParameter("@sub_number",SqlDbType.VarChar,20),
new SqlParameter("@sub_zt",SqlDbType.Int,4),
new SqlParameter("@sub_shway",SqlDbType.Int,4),
new SqlParameter("@sub_zhifu",SqlDbType.Int,4),

new SqlParameter("@sub_shtime",SqlDbType.Int,4),
new SqlParameter("@sub_quehuo",SqlDbType.Int,4),
new SqlParameter("@sub_other",SqlDbType.VarChar,100),
new SqlParameter("@sub_to",SqlDbType.VarChar,10),
new SqlParameter("@sub_mail",SqlDbType.VarChar),
new SqlParameter("@sub_tel",SqlDbType.VarChar,14),

new SqlParameter("@sub_address",SqlDbType.VarChar,50),
new SqlParameter("@sub_post",SqlDbType.VarChar,7),
new SqlParameter("@sub_mt",SqlDbType.VarChar,10),
new SqlParameter("@sub_from",SqlDbType.VarChar,10),
new SqlParameter("@sub_froMmail",SqlDbType.VarChar),
new SqlParameter("@sub_fromTel",SqlDbType.VarChar,14),

new SqlParameter("@sub_fromAddress",SqlDbType.VarChar,50),
new SqlParameter("@sub_fromPost",SqlDbType.VarChar,7),
new SqlParameter("@sub_k",SqlDbType.Int,4),
new SqlParameter("@sub_h",SqlDbType.Int,4),
new SqlParameter("@jbm",SqlDbType .VarChar ,7)
};
param[0].Value=subInfo.SubName;
param[1].Value=subInfo.SubDate;
param[2].Value=subInfo.SubNumber;
param[3].Value=subInfo.SubZT;
param[4].Value=subInfo.SubSongHuo;
param[5].Value=subInfo.SubZhiFu;

param[6].Value=subInfo.SubTotime;
param[7].Value=subInfo .SubQueHuo;
param[8].Value="";
param[9].Value=subInfo.SubTo;
param[10].Value=subInfo.SubMail;
param[11].Value=subInfo.SubTel;

param[12].Value=subInfo.SubAdds;
param[13].Value=subInfo.SubPost;
param[14].Value="";
param[15].Value=subInfo.SubFrom;
param[16].Value=subInfo.SubFromMail;
param[17].Value=subInfo.SubFromTel;

param[18].Value=subInfo.SubFromAdds;
param[19].Value=subInfo.SubFromPost;
param[20].Value=0;
param[21].Value=0;
param[22].Value="";

int acceptRows=SqlHelper .ExecuteNonQuery (SqlHelper .ConnectionDataBase ,CommandType .Text ,Insert_Sub,param);
flag = (acceptRows > 0) ? true : false;

return flag;

}

/// <summary>
/// 根据订单号获取订单信息
/// </summary>
/// <param name="subID"></param>
/// <returns></returns>
public Venshop_subInfo GetVenshop_subBySubNum(string subNumber)
{
Venshop_subInfo objSubInfo;
SqlParameter param=new SqlParameter("@sub_number",SqlDbType.VarChar,20);
param .Value=subNumber;

using (SqlDataReader rdr = SqlHelper.ExecuteReader(SqlHelper.ConnectionDataBase, CommandType.Text, Search_Sub_BySubName, param))
{
if (rdr.Read())
{
objSubInfo = new Venshop_subInfo(rdr.GetInt32(0), rdr.GetString(1), rdr.GetDateTime(2), rdr.GetString(4),rdr.GetInt32(5), rdr.GetInt32(6), rdr.GetInt32(7), rdr.GetInt32(8), rdr.GetInt32(9),rdr.GetInt32(10), rdr.GetString(11), rdr.GetString(12), rdr.GetString(13), rdr.GetString(14),rdr.GetString(15), rdr.GetString(18), rdr.GetString(19), rdr.GetString(20), rdr.GetString(21),rdr.GetString(22));

}
else
{
objSubInfo = null;
}
}
return objSubInfo;
}
/// <summary>
/// 根据用户名查询该用户所有订单信息
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public IList<Venshop_subInfo> GetVenshop_subBySubName(string name)
{
IList<Venshop_subInfo> ILSubInfo=new List<Venshop_subInfo>();
SqlParameter param = new SqlParameter("@sub_name", SqlDbType.VarChar);
param.Value = name;

using (SqlDataReader rdr = SqlHelper.ExecuteReader(SqlHelper.ConnectionDataBase, CommandType.Text, Search_Sub_ByUserName, param))
{
while (rdr.Read())
{
Venshop_subInfo objSubInfo = new Venshop_subInfo(rdr.GetInt32(0), rdr.GetString(1), rdr.GetDateTime(2), rdr.GetString(4), rdr.GetInt32(5), rdr.GetInt32(6), rdr.GetInt32(7), rdr.GetInt32(8), rdr.GetInt32(9), rdr.GetInt32(10), rdr.GetString(11), rdr.GetString(12), rdr.GetString(13), rdr.GetString(14), rdr.GetString(15), rdr.GetString(18), rdr.GetString(19), rdr.GetString(20), rdr.GetString(21), rdr.GetString(22));
ILSubInfo.Add(objSubInfo);
}
}
return ILSubInfo;
}
/// <summary>
/// 根据订单编号删除该订单
/// </summary>
/// <param name="subNumber"></param>
/// <returns></returns>
public bool IsDeleteSub(string subNumber)
{
bool flag = false;
SqlParameter param = new SqlParameter("@sub_number", SqlDbType.VarChar, 20);
param.Value = subNumber;
int acceptRows = SqlHelper.ExecuteNonQuery(SqlHelper.ConnectionDataBase, CommandType.Text, Delete_Sub_BySubNumber, param);
flag = (acceptRows > 0) ? true : false;

return flag;
}

}
}

前台ASPX页面加入了页面缓存:
<%@ OutputCache Duration="1200" VaryByParam="none"%>

itliyi 2009-09-22
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 zzxap 的回复:]
一条很烂的SQL语句足可以使你的一切优化白费
[/Quote]

xzq686 2009-09-22
  • 打赏
  • 举报
回复
学习
wang675725814 2009-09-22
  • 打赏
  • 举报
回复
学习学习
46539492 2009-09-22
  • 打赏
  • 举报
回复
[Quote=引用 166 楼 zkvistor 的回复:]
帖子加不了分,以后另开贴散分,还有个问题 ,页面有个批量修改订的功能,数据达到1K条以上 速度就慢了,我用的是把Excel表格里的数据读取到DataSet里,然后循环遍历DataSet进行修改,不知道各位有没有好的方法?另外Repeater控件相比DataGrid和GridView访问速度要快些么?
[/Quote]
这种操作本身就很耗时,所以尽量不要提供给用户操作,要么就限制操作的数据数。至于提高效率,可以尝试拼sql,一次执行,比如:

declare @tempTab table(userid int)
insert into @tempTab
select 2
union all
select 3
union all
select 4

Repeater确实是最快的,很明显,因为封装的东西少。
46539492 2009-09-22
  • 打赏
  • 举报
回复
[Quote=引用 165 楼 zkvistor 的回复:]
引用 163 楼 46539492 的回复:
先确定一个标准的数据层的代码规范,然后写个代码生成器,一分钟就能把你的数据访问层修正过来。不用一个个文件的改,费劲而且容易出错。

看来生搬硬套还是不行 开始以为仿照PETSHOP上的应该问题不大,现在。。。。。

写个代码生成器??
[/Quote]
Petshop只是提供一种架构方案,不一定能适合所有的项目,需要根据自己的情况做一定的变动。
是的,代码生成器,反射你原来的数据访问层,获取所有的方法,字段,属性等,根据你最新的规范重新生成一套数据访问层,我就这样更改过我三年前的项目,包括实体类,数据访问层,接口层,业务逻辑层,以最小的代价达到了我的目标。你这种情况就可以考虑这么做,特别是你数据访问类比较庞大的情况下。可以考虑存储过程名与方法名一致。然后sqlparameter以存储过程为key缓存起来。写个代码生成器也就两三天的事,还可以练练手,呵呵
zkvistor 2009-09-22
  • 打赏
  • 举报
回复
帖子加不了分,以后另开贴散分,还有个问题 ,页面有个批量修改订的功能,数据达到1K条以上 速度就慢了,我用的是把Excel表格里的数据读取到DataSet里,然后循环遍历DataSet进行修改,不知道各位有没有好的方法?另外Repeater控件相比DataGrid和GridView访问速度要快些么?
加载更多回复(156)

62,075

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧