以下代码,因为 ViewState["dt"] 体积大,确实让ADSL用户刷新页面慢,我想放在cookies,但是它只能储存字符串,如果用Session保存,又担心用户多,又占用服务器资源, 如果不用 ViewState["dt"] 保存,每次去查询SQL SERVER, 又担心查询次数太多,占用太多服务器资源, 大家有没有好的办法呢?
//求得下拉框的参数
Maticsoft.BLL.Apm bll = new Maticsoft.BLL.Apm();
DataTable idt;
idt = bll.GetAllList().Tables[0];
ViewState["dt"] = idt;
//加工点
DataView dv1 = new DataView(idt);
dv1.RowFilter = ("parentcode='35'");
txtga02.DataSource = dv1;
txtga02.DataTextField = "cinvcname";
txtga02.DataValueField = "no";
txtga02.DataBind();
txtga02.Items.Insert(0, new ListItem("", ""));
txtga02.SelectedIndex = 0;
用Cache 适合。 文件太大 不用ViewState、不用cookie。
假如用cache也不好,因为那个经常要更新,并且cache有时间限制,保不准什么时间段就过期了. cache有一个最不好的地方,就是共用的.如果一个用户删掉了进行更新,另外一个用户可能马上调不出来
我这种看法对吗
@zhengyingcan:
不想频繁查询数据库,肯定得缓存起来。
ViewState:
是放在客户端的页面上的,单个用户,每个用户打开页面加载时一样会去数据库读,用户多了,也成问题;
如果关闭页面了,下次重新打开,不也得重新加载吗,从数据库读。
如果ViewState太大了,性能问题。
cookie:
也是存客户端,存放的数据格式有限,你可以序列化成字符串保存,只能缓存单个用户。
用户多了,拿什么来减少查询数据库。
数据大了,也影响性能。跟ViewState差不多,就是有一个持久cookie 。
session:存服务器端,还是单个用户,每个用户一份,每个session都得去查数据库,数据大了,耗内存。
cache:全局共享,第一次加载填充cache;
共享更新问题,Cache本身就线程安全的,防并发的,放心使用。
你更新时,先更新数据库,再更新cache,如果cache为空,就去查数据库,再填充cache,你说的 删除cache了,此时别人再访问cache时为空,自然会去数据库读,再填充cache,你也不用担心更新cache时被覆盖了,人家cache是安全的。
更新cache,也不一定就要删除cache吧,直接赋值。
你可以是用cache来保存的啊
方法很多,看你各方面取舍了
如果不想给你的服务端造成太大压力,可以缓存到客户端
缓存在客户端是最好的办法,但是缓存必须要用到ViewState["dt"],但是ViewState["dt"]体积太大,光纤的没有问题,但是ADSL,就出问题了, 假如用cache也不好,因为那个经常要更新,并且cache有时间限制,保不准什么时间段就过期了. cache有一个最不好的地方,就是共用的.如果一个用户删掉了进行更新,另外一个用户可能马上调不出来.
看你方法的取名“GetAllList()”难道是取出所有数据?然后放到viewstate里面?没这么存的吧?即使是cache,也不该这么存吧?
能不能帮忙举个例子,谢谢
@zhengyingcan: 即使是你真想要存在viewstate里面,那这个viewstate是要存到客户端的,你把所有数据全存到客户端这当然不行,如果这个列表里面有一万条数据你也都发送到客户端吗?显然没必要,你首先要想到的是:要分页!,客户需要看到的只是一页数据,那就只给他一页数据,比如你的列表总共有一万条数据,但是客户只需要看到10条,那你把这10条发送到客户端就行了,你这个还远没遇到性能问题呢。
既然经常更新,每次都从数据库查就是了,把parentcode='35'条件放sql里查。
貌似你的txtga02是个下拉框吧?下拉框能有多少数据,没什么影响。
这样子肯定是没有问题的,只是担心用户太多,查询次数也多,会降低服务器效率.