向SP1234大哥问个物联网性能问题~~

wbrcqu 2010-06-29 03:46:24

历史原因:公司从移动手里面交接过来的项目,现在老大把这个东西全权交给我处理了,我自己也分析了一份报告,还请大哥看哈有什么不足的地方,提供点思路。。。。我不要源码的哈~~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 秒上下,用户完全可以接受。
缺点:改完这一次,还有下一次,治标不治本。特别是页面数据日益繁多的时候,情况更差。
耗时:最少,一星期可完工。


...全文
390 42 打赏 收藏 转发到动态 举报
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
doubleu2005 2010-07-03
  • 打赏
  • 举报
回复
帮顶,接分
shuimenjian1989 2010-07-03
  • 打赏
  • 举报
回复
每天回帖加10分
wbrcqu 2010-07-02
  • 打赏
  • 举报
回复
我每天一顶~~~~
wbrcqu 2010-07-02
  • 打赏
  • 举报
回复
回楼上,物联网和云计算是当今IT界最火的两个东西~~~~简单的概括物联网便是

硬件的多终端分布式控制系统
sxiaohui8709253 2010-07-02
  • 打赏
  • 举报
回复
路过 我公司也是搞物联网的 我还没搞明白是干啥的~~~~~~~~~~~~
大哥-你真棒 2010-07-02
  • 打赏
  • 举报
回复
顶顶顶顶顶~~!!
大黄鸭在发光 2010-07-02
  • 打赏
  • 举报
回复
再帮lz顶一下
wbrcqu 2010-07-01
  • 打赏
  • 举报
回复
回楼上~~~好,我承认你的作风很严谨~~~~~
wanghui0380 2010-06-30
  • 打赏
  • 举报
回复
要用事实说话,不要凭空猜测和指责。不能因为他们的代码和习惯你觉着别扭就武断的说人家的东西有问题
wanghui0380 2010-06-30
  • 打赏
  • 举报
回复
没啥可说,不要凭空猜测,要有根据
1。你是否用压力测试工具测试过你的站
2。你是否使用过http封包检测工具,检测过你的站的页面加载顺序和执行时间
3。你是否检查页面的div布局是否合理
4。你是否使用数据库事件探查工具检查过sql语句的执行情况
5。你是否用Profiler工具跟踪过项目性能,内存耗费和对象生存期
大黄鸭在发光 2010-06-30
  • 打赏
  • 举报
回复
再帮顶,lz直接去空间留言可能会看到。
wbrcqu 2010-06-30
  • 打赏
  • 举报
回复
。。。貌似大哥。。。对我这个问题不感冒。。。。那我就只好自己处理了~
大黄鸭在发光 2010-06-30
  • 打赏
  • 举报
回复
帮顶,之前看过sp1234的留言。感觉话说的很高深。
wbrcqu 2010-06-30
  • 打赏
  • 举报
回复
我的亲大哥哇~~~~我等秋水望穿的等了你一天了。。。你倒是冒个泡呀~~~~
doubleu2005 2010-06-29
  • 打赏
  • 举报
回复
你大哥没来啊
wbrcqu 2010-06-29
  • 打赏
  • 举报
回复
不好意思了各位,我下班了。。。。明天我会准时回复各位的意见~~~谢谢~~~O(∩_∩)O~~~
wbrcqu 2010-06-29
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 ledmhcc 的回复:]
引用 22 楼 wbrcqu 的回复:
有谁可以肯定的答复我,linq语句的每次使用都是会重新创建一个新的数据库连接,当延迟加载完毕后,即,数据操作执行完毕之后 就会自动关闭连接,下次使用又重新打开?如此周而复始?? 这一特性各位能够肯定吗?

数据提交以后肯定自动关闭的,一般是在一次连接中尽可能的把想要的数据都拿出来,要多次使用的就放内存里,在update insert等动作时用存储过程或……
[/Quote]

请问这位同仁,我可以控制在linq中的连接吗,譬如说,我在页面启动的时候激活一个连接,然后控制这个连接一直不关闭,然后之后的所有linq都使用这个连接,在所有的数据操作都执行完毕后再手动关闭或是析构?
ledmhcc 2010-06-29
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 wbrcqu 的回复:]
有谁可以肯定的答复我,linq语句的每次使用都是会重新创建一个新的数据库连接,当延迟加载完毕后,即,数据操作执行完毕之后 就会自动关闭连接,下次使用又重新打开?如此周而复始?? 这一特性各位能够肯定吗?
[/Quote]
数据提交以后肯定自动关闭的,一般是在一次连接中尽可能的把想要的数据都拿出来,要多次使用的就放内存里,在update insert等动作时用存储过程或批量的SQL语句一次提交
lds1ove 2010-06-29
  • 打赏
  • 举报
回复
sfsf
wbrcqu 2010-06-29
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 whb147 的回复:]
说实话,我的机器还没有升级到linq
嘿嘿,飘过
[/Quote]

那请问这位同仁,我上面的讲到的linq特性你能确定吗?
加载更多回复(22)

111,125

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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