从USER_CHANGE_NOTIFICATION_REGS取消注册字符串

问题描述

如果表中发生任何更改,我正在使用Oracle更改通知获取实时更新。当用户启用他的会话并单击复选框时,我正在执行以下代码。当他启用会话时,我将依赖对象存储在会话和USER_CHANGE_NOTIFICATION_REGS表中。当他取消选中该复选框时,我将使用会话中存储的值删除依赖关系,并将其从USER_CHANGE_NOTIFICATION_REGS中删除。问题是用户关闭浏览器或应用程序崩溃。然后过时的REG_ID保留在USER_CHANGE_NOTIFICATION_REGS中,并且由于先前的注册未正确删除,最终用户多次收到通知。什么是解决此问题的最佳解决方

USER_CHANGE_NOTIFICATION_REGS

public void RefreshData(int deskId,int flag,string sectionid)
        {
            try
            {

                if (flag == 0)
                {
                    cmd = new OracleCommand();
                    cmd.Parameters.Clear();
                    cmd.Connection = con;
                    con.open();
                    dependency = new OracleDependency(cmd);
                    if (Session["dependency"] != null)//If already subscribed remove registration
                    {
                        dependency = (OracleDependency)Session["dependency"];
                        dependency.RemoveRegistration(con);
                        Session["dependency"] = null;
                        
                    }
                    con.Close();
                    return;
                }

                if (con.State == ConnectionState.Open)
                {
                    con.Close();
                }
                cmd = new OracleCommand();
                cmd.Parameters.Clear();
                cmd.Connection = con;
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = "QMS.Q_OPERATION_SP.GET_SUBSCRIbed_DATA";
                cmd.BindByName = true;
                cmd.Parameters.Add("p_ref",OracleDbType.RefCursor,ParameterDirection.Output).Value = null;
                cmd.Parameters.Add("in_DESK_ID",OracleDbType.Int32,16).Value = deskId;
                cmd.Parameters.Add("in_USER_ID",16).Value = Convert.ToInt32(Session["UserId"]);
                cmd.Parameters.Add("in_OVERRIDE_DESK_FLAG",16).Value = Convert.ToInt32(Session["OverrideDeskFlag"]);
                con.open();
               
                if (Session["dependency"] != null)//If already subscribed remove registration
                {
                    dependency = (OracleDependency)Session["dependency"];
                    dependency.RemoveRegistration(con);
                    Session["dependency"] = null;
                }
                dependency = new OracleDependency(cmd);
                if (dependency.RegisteredQueryIDs.Count > 0)
                {
                    dependency.RemoveRegistration(con);
                    Session["dependency"] = null;
                }
                dependency.QueryBasednotification = true;
                cmd.Notification.IsNotifiedOnce = false;
                dependency.OnChange += new OnChangeEventHandler((s,e) => AlertUser(s,e,sectionid));
                OracleDataReader reader = cmd.ExecuteReader();
                Session["dependency"] = dependency;
            }
            catch(Exception exc)
            {
                
                ViewBag.errorD= exc.ToString(); ;
          
            }

        }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)