现在的位置: 首页 > 综合 > 正文

asp.net ajax repeater 嵌套 引发 超时

2012年10月11日 ⁄ 综合 ⁄ 共 1381字 ⁄ 字号 评论关闭
超时时间已到。超时时间已到,但是尚未从连接池获取连接。
出现这种情况可能是因为所有池的连接均在使用,并且达到了最大池大小。

昨天做一个异常处理的小例子,采用ASP.NET AJAX 技术,功能上实现
Repeater 嵌套 Repeater ,最外层Repeater 显示时间段,里层的Repeater 显示该时间段的异常。
做完之后,测试一下,一切正常。

最外层Repeater 只有6条数据,里层Repeater 对于外层的Repeater 都有4条数据,页面分了3页,采用自定义分页。
效果还不错,但是反复点击分页,就报了以上的错误,轻微关掉VS,重新打开再运行就可,严重的注销之后,重新运行
仍然报上面的错误。

我首先就给错误下了一个定义:滥用AJAX,只要不反复点击就没有问题了。

过了 一天,因外其他原因还要打开这个项目,还是出现以前的情况,实在是心有不干 。
然后用 Gridview 做了同样的一个例子,采用自带的分页,同样反复的请求,但是却没有出现这样的情况。
为什么没有呢 ?

难道是分页 有问题,我把分页注释掉,只是绑定,重新运行,仍然报那个错误,这个错误持续时间也太长了。

突然看到了一行代码;repErrors_ItemDataBound ,想到了问题的所在

将里面的代码注释掉之后,一切正常了。
原来是 嵌套Repeater 搞的鬼。
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
HtmlInputHidden hi = (HtmlInputHidden)e.Item.FindControl("Hidden1");
Repeater rep = (Repeater)e.Item.FindControl("repErrorinfo");

rep.DataSource = ers.GetErrorInfo(Int32.Parse(hi.Value));
rep.DataBind();
}
这是我以前的代码,GetErrorInfo 是一个方法,根据传递的 外层ID,从数据库查找 里层的信息。
但是这样做的话,每次绑定都会 连接一次数据库 。难怪 服务器吃不消呢 ?

都是我的错。

重新修改了一下代码,就好了。OK !
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
HtmlInputHidden hi = (HtmlInputHidden)e.Item.FindControl("Hidden1");
Repeater rep = (Repeater)e.Item.FindControl("repErrorinfo");

DataSet ds = null;

if (Cache["Repds"] != null)
{
ds = (DataSet)Cache["Repds"];
}
else
{
Cache.Insert("Repds", (DataSet)ers.GetErrorInfo());
ds = (DataSet)Cache["Repds"];
}
rep.DataSource = ers.GetErrorInforep(ds, Int32.Parse(hi.Value));
rep.DataBind();

}
===============

抱歉!评论已关闭.