开发环境及架构:vs2005+SQlServer2005,传统3层架构:UI+BL+DAL
使用场景:利用sql2005的CommandNotification功能,在web页面使用ObjectDataSource缓存数据程序片断:
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" OldValuesParameterFormatString="original_{0}" CacheDuration ="Infinite"   
            SelectMethod="GetDataFromDB" TypeName="Datacache.DemoBL" EnableCaching ="True" SqlCacheDependency ="CommandNotification" ></asp:ObjectDataSource>说明:ObjectDataSource 调用BL层的方法GetDataFromDB从后台获取数据问题:当数据库中对应的表的数据发生改变时,cache的数据未清空,因此,页面刷新时,ObjectDataSource 的数据为发生变化。请各位大虾不吝赐教!!!同时也可以谈谈多层架构中数据缓存的实现。(注意:UI不能直接连接数据库)

解决方案 »

  1.   

    记得数据库缓存依赖是要在数据库建一个记录的表的,记录哪些表发生了变化。
    msdn上是这么说的:
    为使此类在使用基于表的通知时正常工作,必须为数据库及要设置依赖项的任何表启用通知。可通过使用 SqlCacheDependencyAdmin 类的方法或 Aspnet_regsql.exe 命令行工具启用通知。同时,应用程序的 Web.config 文件中必须包含正确的配置设置。
      

  2.   

    应该在cache和数据库之间建立数据同步的机制,比如:可以在数据库中建立触发器,当数据变化时,通知cache更新数据。也可以在客户端保存数据到数据库中时,同步保存到cache
      

  3.   

    public DataTable dtbList;
     public DataTable GetListTable()
        {
            DataTable dtbLocal = new DataTable();
            if (dtbList == null)
                dtbLocal = (DataTable)Cache["List"];
            else
            {
                dtbLocal = dtbList;
                Cache["List"] = dtbLocal;
            }
            return dtbLocal;
        }
       dtbList = DALCompanyList.C_SelectCompanyListByStrWhere(" WHERE (A.AgentID =" + GetAgentID() + ")");  GridView1.DataSource = GetListTable().DefaultView;
                    GridView1.DataBind();
      

  4.   

    to geek007() :
    有一个问题,你的cache何时清空?这必然要用轮询的方式,不是我想要的结果呀,呵呵。
    希望能够利用sql2005的CommandNotification
      

  5.   

    private static object CreateObject(string path,string CacheKey)
    {
    object objType = DataCache.GetCache(CacheKey);
    if (objType == null)
    {
    try
    {
    objType = Assembly.Load(path).CreateInstance(CacheKey);
    DataCache.SetCache(CacheKey, objType);// 写入缓存
    }
    catch//(System.Exception ex)
    {
    //string str=ex.Message;// 记录错误日志
    }
    }
    return objType;
    }
    推荐你去看看PETSHOP4.0
      

  6.   

    to fengyishou(霜之哀伤) :
        PETSHOP4.0用的是轮询,而非sql2005的CommandNotification!!