SQL2008的通知缓存模式怎么使用??

xuexiaodong2009
博客专家认证
2011-09-09 02:26:07
http://ajava.org/course/mssql/5815.html
按照这篇文章的顺序处理,当数据有变动时,没反应?
操作系统是windows server web 2008 r2,数据库为SQL2008R2
已经安装了.net4.0
  void Application_Start(object sender, EventArgs e)
{
#region SQL2005

SqlDependency.Start(WebConfigHelper.ConnectionString_SQL2005); //推荐将这段代码加到Global.asax的Application_Start方法中,

#endregion


}

void Application_End(object sender, EventArgs e)
{
// Code that runs on application shutdown
SqlDependency.Stop(WebConfigHelper.ConnectionString_SQL2005);

}


protected void Page_Load(object sender, EventArgs e)
{
// if (!IsPostBack)
// {
DataTable dt = HttpRuntime.Cache["dt"] as DataTable;
if (dt == null)
{
using (SqlConnection sqlCon = new SqlConnection(WebConfigHelper.ConnectionString_SQL2005))
{
sqlCon.Open();
SqlCommand sqlCmd = new SqlCommand();
sqlCmd.Connection = sqlCon;
sqlCmd.CommandText = "select col2 from dbo.TableTest";
dt = new DataTable();

// SqlDependency dependency = new SqlDependency(sqlCmd);
// dependency.OnChange += this.dependency_OnChange;

SqlCacheDependency scd = new SqlCacheDependency(sqlCmd);
// 注册方法到委托,该委托是

CacheItemRemovedCallback onRemove = new CacheItemRemovedCallback(RemovedCallback);

// 新增或修改一条缓存记录
// scd.OnChange += new OnChangeEventHandler(scd_OnChange);

// scd. += new OnChangeEventHandler(Dependency_OnChange);
SqlDataAdapter sda = new SqlDataAdapter(sqlCmd);

sda.Fill(dt);
// HttpContext.Current.Cache.Insert("dt", dt, scd, DateTime.MaxValue, TimeSpan.Zero, CacheItemPriority.Default, onRemove);
HttpRuntime.Cache.Insert("dt", dt, scd, DateTime.Now.AddHours(1), TimeSpan.Zero, CacheItemPriority.Default, onRemove);
// HttpRuntime.Cache.Insert("dt", dt);
sqlCon.Close();
}
}
GridView1.DataSource = dt;
GridView1.DataBind();
// }
}
...全文
397 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuexiaodong2009 2011-09-13
  • 打赏
  • 举报
回复
原因知道了,竟然是一个顺序问题导致了
http://blog.csdn.net/xuexiaodong2009/article/details/6771005
叶子 2011-09-12
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 xuexiaodong2009 的回复:]
引用 15 楼 xcx573 的回复:

楼主就是牛人啊 哈哈
一般先看MSDN吧,上面没有吗
“发出去的通知客户端接收不到”
通知是什么形式的,到客户端哪个端口,需要启动什么服务吗,抓个包看看
不是你想的那么简单啊,试了4个SQL客户端,只有一个可以,三个不行,但还没发现这几个客户端有什么不一样,都是同一个虚拟机拷贝,复制出来的
[/Quote]
貌似不是代码的问题,应该是设置的问题。
xuexiaodong2009 2011-09-11
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 xcx573 的回复:]

楼主就是牛人啊 哈哈
一般先看MSDN吧,上面没有吗
“发出去的通知客户端接收不到”
通知是什么形式的,到客户端哪个端口,需要启动什么服务吗,抓个包看看
[/Quote]不是你想的那么简单啊,试了4个SQL客户端,只有一个可以,三个不行,但还没发现这几个客户端有什么不一样,都是同一个虚拟机拷贝,复制出来的
肖无疾 2011-09-09
  • 打赏
  • 举报
回复
楼主就是牛人啊 哈哈
一般先看MSDN吧,上面没有吗
“发出去的通知客户端接收不到”
通知是什么形式的,到客户端哪个端口,需要启动什么服务吗,抓个包看看
xuexiaodong2009 2011-09-09
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 csnd_freeman 的回复:]

这个必须标记下

楼主说说机器什么问题会产生这个原因呢!
[/Quote]具体原因还没找到,怀疑是SQL配置问题导致的,发出去的通知客户端接收不到
freemangood 2011-09-09
  • 打赏
  • 举报
回复
这个必须标记下

楼主说说机器什么问题会产生这个原因呢!
t7sky2011 2011-09-09
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xuexiaodong2009 的回复:]
引用 10 楼 t7sky2011 的回复:

在我理解,sql依赖的三步曲

1丶cmd命令注册你要缓存的资料表
aspnet_regsql -S <server> -U sa -P sa -d <database> -t <table> -et
(对应到.net Framework目录下执行)

2丶使用高速缓存
C# code
private const string C……
[/Quote]


xuexiaodong2009 2011-09-09
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 t7sky2011 的回复:]

在我理解,sql依赖的三步曲

1丶cmd命令注册你要缓存的资料表
aspnet_regsql -S <server> -U sa -P sa -d <database> -t <table> -et
(对应到.net Framework目录下执行)

2丶使用高速缓存
C# code
private const string CacheKey = "_CachKey";

……
[/Quote]你这种是轮询模式,不是通知模式,原因找到了,是机器原因,具体的就不知道了
t7sky2011 2011-09-09
  • 打赏
  • 举报
回复
在我理解,sql依赖的三步曲

1丶cmd命令注册你要缓存的资料表
aspnet_regsql -S <server> -U sa -P sa -d <database> -t <table> -et
(对应到.net Framework目录下执行)

2丶使用高速缓存
private const string CacheKey = "_CachKey";

public Model.SiteItem GetCacheSiteSetting(SqlConnection connection, string siteID)
{
Model.SiteItem Item = System.Web.HttpRuntime.Cache[CacheKey] as Model.SiteItem;

if (Item == null)
{
//重新查询Model
Item = siteDAL.QuerySiteItem(connection, siteID);

System.Web.Caching.AggregateCacheDependency dependency = new System.Web.Caching.AggregateCacheDependency();

dependency.Add(new System.Web.Caching.SqlCacheDependency("Site", "s_site"));

//如果數據沒有更變則緩存12小時
System.Web.HttpRuntime.Cache.Add(CacheKey, Item, dependency, DateTime.Now.AddHours(12), System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.High, null);

}

return Item;
}


3丶Web.config配置

<system.web>
<caching>
<sqlCacheDependency enabled="true" pollTime="10000">
<databases>
<add name="Site" connectionStringName="SQLConnString1" pollTime="10000" />
</databases>
</sqlCacheDependency>
</caching>
</system.web>

SQLConnString1是指向你数据库的连接

4丶资料库
成功之后你资料库会有一个表AspNet_SqlCacheTablesForChangeNotification
里面会存一笔s_site的数据
xuexiaodong2009 2011-09-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 t7sky2011 的回复:]

不知道我有没有曲解楼主的意思,你的意思是否是,你资料库手动改完资料,你GridView1要自动变更页面数据?
[/Quote]数据库数据改变后,重新请求需要获取新的数据,而不是缓存中的旧数据
shadan05 2011-09-09
  • 打赏
  • 举报
回复
没整过,up
t7sky2011 2011-09-09
  • 打赏
  • 举报
回复
不知道我有没有曲解楼主的意思,你的意思是否是,你资料库手动改完资料,你GridView1要自动变更页面数据?
vrhero 2011-09-09
  • 打赏
  • 举报
回复
启用Service Broker没有?
xuexiaodong2009 2011-09-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 t7sky2011 的回复:]

Google查找 sql 依赖
http://www.cnblogs.com/over140/archive/2009/01/15/1376318.html
http://www.jb51.net/article/20360.htm

希望能帮到LZ
[/Quote]我都看过了,希望有使用过得牛人指点下
xuexiaodong2009 2011-09-09
  • 打赏
  • 举报
回复
轮询模式我会,就是通知模式不行不知道原因
t7sky2011 2011-09-09
  • 打赏
  • 举报
回复
Google查找 sql 依赖
http://www.cnblogs.com/over140/archive/2009/01/15/1376318.html
http://www.jb51.net/article/20360.htm

希望能帮到LZ
xuexiaodong2009 2011-09-09
  • 打赏
  • 举报
回复
没牛人啊?都放假了啊?
ycproc 2011-09-09
  • 打赏
  • 举报
回复
mark

今天一些 帖子 质量很高
关注下

110,502

社区成员

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

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

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