向SP1234大哥问个物联网性能问题~~
历史原因:公司从移动手里面交接过来的项目,现在老大把这个东西全权交给我处理了,我自己也分析了一份报告,还请大哥看哈有什么不足的地方,提供点思路。。。。我不要源码的哈~~O(∩_∩)O~~~我最喜欢思路了~~~
再次感谢各位提供意见的csdner!
物联网性能诊断报告
1. 物联网现阶段问题描述
页面打开速度过慢,打开部分页面的速度在30秒上下,大大超过用户的容忍限度
2. 问题原因
引发问题的原因有以下几点:
数据库方面
一. 数据库操作上采用linq+edmx,其中原代码在使用linq的时候全是使用linq的默认数据库连接。
即,把所有的linq操作都封装为一个函数,而在相应的函数里面却没有手动控制会话的连接,导致在每次
调用操作函数的时候都会自动创建会话,在函数使用完毕后又自动关闭会话,在一个page_load页面加载
中的一次打开页面要打开和关闭会话达60次以上。。。。当然,在数据查询不过于频繁,数据返回量不过于
庞大的情况下,使用linq的默认会话连接是完全没问题的。而且linq的延迟加载也在一定程度上影响了系统
的性能。
查询方面
二. 查询过程过于繁琐,如以下情况在原代码中出现频率相当高
shuiBengDevId = aquiculture.GetDevId(1, 4000);
shuiBengChId = aquiculture.GetChId(shuiBengDevId, 1, 1);
shuiBengChValue = aquiculture.ConvertChState(aquiculture.GetChSts(shuiBengChId));
相当于是在查询一个数据的时候使用了两个中间值,这大大的降低了页面的显示速度。注:GetDevId GetChId GetChSts
等都是封装了linq语句的函数。
而且查询语句相当零碎,很少出现联表查询或是多条件查询,增加了查询次数。
代码方面
三. 把数据的查询与显示全部都写在了页面加载函数中,使得如果所有的数据没有完全查询完毕进入缓存,那页面就无法显示。
最多的一个page_load函数里面的查询操作在60次以上,这个页面也是最慢的忠县页面。。。。。但是这些数据并不是进入界面
用户就可以看到的,而是要用户点击进入子菜单才可以看到。
3. 解决方法
一. 上策:以基础数据操作为主
修改整个系统的数据库操作方式为原始ADO,并封装出一个与业务相关的数据库操作类便于控制会话和连接池,而且直接操作
数据库效率最高,把连接放在缓存中,使用的时候就激活连接会话。如以下组件:
public SqlDataReader GetData(string sqlstring)
{
SqlDataReader data = null;
SqlConnection con = new SqlConnection("就不让你们看了哈 免得攻击我");
try
{
SqlCommand com = new SqlCommand(sqlstring, con);
con.Open();
data = com.ExecuteReader(CommandBehavior. CloseConnection);
}
catch (Exception e)
{
con.Close();
MessageBox.Show(e.ToString());
}
return data;
}
缺点:改动较大
耗时:较长
二.中策: 以查询效率为主
修改系统中琐碎的查询语句,合并为完整的一句,减少查询次数,初步估计在如果把忠县的数据查询合并后,那么查询次数将会从60次上下
骤降至30次不到那么页面刷新时间也将大大缩短甚至更多。
缺点:量不大不小,过程很繁琐
耗时:一般
三.下策:以用户体验为主
把写在page_load页面里面的60多个数据字段用Ajax异步刷新,并把代码从page_load页面中提出来,在用户点击页面时可以在后台下载数据
当用户点击每一个感兴趣的子菜单的时候,数据返回时间大概在1 秒上下,用户完全可以接受。
缺点:改完这一次,还有下一次,治标不治本。特别是页面数据日益繁多的时候,情况更差。
耗时:最少,一星期可完工。