开发环境及架构: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不能直接连接数据库)
使用场景:利用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不能直接连接数据库)
msdn上是这么说的:
为使此类在使用基于表的通知时正常工作,必须为数据库及要设置依赖项的任何表启用通知。可通过使用 SqlCacheDependencyAdmin 类的方法或 Aspnet_regsql.exe 命令行工具启用通知。同时,应用程序的 Web.config 文件中必须包含正确的配置设置。
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();
有一个问题,你的cache何时清空?这必然要用轮询的方式,不是我想要的结果呀,呵呵。
希望能够利用sql2005的CommandNotification
{
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
PETSHOP4.0用的是轮询,而非sql2005的CommandNotification!!