微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

asp.net中的SqlDependency

我正在使用sqlDependency来控制我的缓存.我想用它来监控几个表(大约10个).每个观看的表应该有一个sqlDependency.

我应该为每个代码创建这样的代码

public void CreateDependency_Table()
    {
        if (connectionStringSettings != null)
        {
            using (sqlConnection conn = new sqlConnection(connectionStringSettings.ConnectionString))
            {
                conn.open();
                using (sqlCommand cmd = new sqlCommand("SELECT id from dbo.Table",conn))
                {
                    cmd.Notification = null;
                    sqlDependency sqlDependency = new sqlDependency(cmd);
                    sqlDependency.OnChange += new OnChangeEventHandler(sqlDep_Table_OnChange);
                    using (sqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
                    {
                    }
                }
            }
        }
    }

和:

private void sqlDep_Table_OnChange(object sender,sqlNotificationEventArgs e)
    {
        sqlDependency dependency = (sqlDependency)sender;
        dependency.OnChange -= sqlDep_Table_OnChange;

        MyCacheWhatever.Clear();

        //Re-attach dependency
        CreateDependency_Table();
    }

或者我可以在它们之间重复使用它喜欢连接?

这是设置多个通知的首选方式吗?

解决方法

在这里,我将向您展示一个可以帮助您的linq扩展:
public static class LinqExtensions
 {
  private static ILog _Log = LogManager.GetLogger(MethodInfo.GetCurrentMethod().DeclaringType);

  [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design","CA1031:DoNotCatchGeneralExceptionTypes")]
  public static IList<T> LinqCache<T>(this Table<T> query) where T : class
        {
            string tableName = query.Context.Mapping.GetTable(typeof(T)).TableName;
   IList<T> result = HttpContext.Current.Cache[tableName] as List<T>;

            if (result == null)
            {
    try
    {
     using (sqlConnection cn = new sqlConnection(query.Context.Connection.ConnectionString))
     {
      cn.open();
      sqlCommand cmd = new sqlCommand(query.Context.GetCommand(query).CommandText,cn);
      cmd.Notification = null;
      cmd.NotificationAutoEnlist = true;

      _Log.DebugFormat("Attempting to enable sql cache dependency notifications for table {0}",tableName);

      sqlCacheDependencyAdmin.EnableNotifications(query.Context.Connection.ConnectionString);

      string[] tables = sqlCacheDependencyAdmin.GetTablesEnabledForNotifications(query.Context.Connection.ConnectionString);

      if (!tables.Contains(tableName))
       sqlCacheDependencyAdmin.EnableTableForNotifications(query.Context.Connection.ConnectionString,tableName);

      _Log.DebugFormat("sql cache dependency notifications for table {0} is enabled.",tableName);

      sqlCacheDependency dependency = new sqlCacheDependency(cmd);
      cmd.ExecuteNonQuery();

      result = query.ToList();
      HttpContext.Current.Cache.Insert(tableName,result,dependency);

      _Log.DebugFormat("Table {0} is cached.",tableName);
     }
    }
    catch (Exception ex)
    {
     result = query.Context.GetTable<T>().ToList();
     HttpContext.Current.Cache.Insert(tableName,result);

     string msg = string.Format(CultureInfo.InvariantCulture,"Table {0} is cached without sqlCacheDependency!!!",tableName);

     _Log.Warn(msg,ex);
    }
            }
            return result;
        }
    }

原文地址:https://www.jb51.cc/aspnet/249274.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐