如何解决从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 举报,一经查实,本站将立刻删除。