当enable-caching为true时,未为ObjectDatasource引发选定的事件

时间:2010-02-23 09:23:21

标签: caching count record objectdatasource

我使用ODS(ObjectDataSource)获取Gridview控件来获取数据。为了获得最佳性能和效率,我关闭了Gridview的视图状态(即EnableViewstate =“false”。

我还在关联的Objectdatasource中启用了缓存。这消除了高达50-60%的性能优化,因为它消除了DB往返..礼貌的ODS缓存。

所以,在此之后我陷入了着名的“ODS排序”问题,但我设法为它创造了一个棘手的解决方案,并且它的工作正常:

  

Optimize Pagination & Sorting with ObjectDataSource having EnableCaching = true

接下来的分页,它也运行良好。现在,我需要在Gridview的顶部显示“Total records:X”。好吧,我部署了以下方法:

protected void ods_Selected(object sender, ObjectDataSourceStatusEventArgs e)
        {
            if(e.ReturnValue != null && e.ReturnValue.GetType() == typeof(int))
                base.setTotalLabel(lblTotal, e.ReturnValue);
        }

不要混淆 - base.setTotalLabel是我自己的方法来设置带有count的标签文本。这也很好,但问题是 -

  

每当ODS从中获取数据时   它的缓存不会触发   ODS_Selecting或ODS_Select事件。   它们只是“被旁路”,因为它   从缓存中获取数据。这就是我   无法刷新总记录   算!

我希望我的问题解释得很好,这很棘手。我已经准备好为此做任何技巧或脏代码了,因为我想维护ODS缓存,而且由于偶然的“错误更新”而无法回滚更改。

请帮助!

3 个答案:

答案 0 :(得分:1)

这对我有用我设置了CacheKeyDependency,并且每当我想刷新时我都明确地将它设置为一个新值。如果我想显式刷新,我在querystring中传递& refresh = 1。

在.aspx -

<asp:ObjectDataSource ID="odsOrg" runat="server" SelectMethod="SearchOrg" ... EnableCaching="true" CacheDuration="60" CacheKeyDependency="key1">

在代码背后 -

public const string argRefresh = "refresh=1";
public void CheckExpiredCacheKey(string ckey)
{
 if (Cache[ckey] == null) 
  Cache[ckey] = new object(); //Set Cache key which will b used to manually expire ODS cache     

if (!IsPostBack && Request.QueryString["refresh"] == "1")//check refresh flag
 {
    //Cache.Remove(ckey);//NOT NEEDED: use the following instead
    Cache[ckey] = new object();// Needed otherwise it'll call Grid-populate twice
 } 
}

答案 1 :(得分:0)

我有完全相同的问题?

我一直在做的解决方案是在gridview数据绑定方法中再次调用select count方法(通过BLL)并将其存储在viewstate var中,然后使用它来显示记录数。但这导致了两件事:

  • 对DB count sp的另一个调用(失败缓存目的)
  • 陈述冲突,即显示的缓存记录数可能与实际数字不匹配(最新)

答案 2 :(得分:0)

我通过在所选事件期间将记录计数存储在会话变量中来解决此问题:

protected void odsSearchResults_Selected(object sender, ObjectDataSourceStatusEventArgs e)
    {
        DataTable resultsTable = e.ReturnValue as DataTable;
        if (resultsTable == null)
        {
            return;
        }
        Session["ResultCount"] = resultsTable.Rows.Count;
        lblRecordCount.Text = resultsTable.Rows.Count.ToString();
    }

然后在Page_Load中,如果session var不为null,则显示记录计数:

if(Session["ResultCount"] != null)
{
    lblRecordCount.Text = Session["ResultCount"].ToString();
}

现在,如果数据来自缓存,lblRecordCount将显示记录计数