难题来了,隔一段时间下拉列表空了,可能是关于NHibernate的

zk0233 2020-05-02 09:09:46
一个3000多用户的系统,用的是.net 4.0应用程序池和ASP.NET+mvc3,数据访问用的是NHibernate。
问题是:隔一段时间,长则半年一两个月,短则10几天,就会出现从数据库中一个代码表中取不到值,表现为我页面中的表单,这个下拉列表显示不出内容,比如:学历下拉列表中的“初中”、“高中”、“本科”。可是你说我这是数据库出问题了,但我查询还能够显示每个人一行的结果数据,只是学历这一栏是空的。
由于用户无法继续使用系统,所以没有等太长时间以观察这种情况是否能自己恢复正常(等了好久看样子不会自己好转),就重启IIS或重启服务器,之后问题解决。
这个系统数据库是sqlserver,我另外一个系统,也有同样问题,数据库是oracle。
代码:
                
IList<CodeItem> item = Session.CreateCriteria(typeof(CodeItem))
.Add(Expression.Eq("TypeId", typeId.ToString()))
.AddOrder(Order.Asc("OrderNo"))
.List<CodeItem>();
return item;

为了尝试解决问题,我把怀疑出问题的地方加了try catch以捕捉错误信息,因为我怀疑这个return item是空:
  
string logaddress = "D:\\AppRuntimeLog\\unknown" + System.DateTime.Now.ToString("yyyyMMdd") + ".log";
try
{
IList<CodeItem> item = Session.CreateCriteria(typeof(CodeItem))
.Add(Expression.Eq("TypeId", typeId.ToString()))
.AddOrder(Order.Asc("OrderNo"))
.List<CodeItem>();
return item;
}
catch(System.Exception ex)
{
using (System.IO.StreamWriter sw = new System.IO.StreamWriter(logaddress, true, System.Text.Encoding.UTF8))
{
string errstring = "IsConnected=" + Session.IsConnected.ToString();
errstring += ",IsOpen=" + Session.IsOpen.ToString();
errstring += ",TypeId=" + typeId.ToString();
errstring += ",时间=" + System.DateTime.Now.ToString() + "\n";
errstring += ",ex.Message=" + ex.Message + "\n";
sw.Write(errstring);
}
return null;
}

至今10几天了,问题没有再现,我的捕捉错误信息日志也没有得到,得到后我会发到本帖子中。
别告诉我说NHibernate访问量大时会自己崩溃



...全文
314 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zk0233 2020-08-11
  • 打赏
  • 举报
回复
得到一条日志: IsConnected=True,IsOpen=True,TypeId=10,时间=2020/7/23 15:41:45 ,ex.Message=Could not compile the mapping document: Cont.Entity.Foundation.Mapping.Department.hbm.xml 问题未能因此而解决。后来我在系统中加了重启IIS功能,省去了我每次跑机房的事
正怒月神 版主 2020-05-13
  • 打赏
  • 举报
回复
没用过nhibnate。 Session的生成代码发出来看看。 不会是静态的吧?
大然然 2020-05-13
  • 打赏
  • 举报
回复
空的 时候F12看看取的TypeId是多少,然后在数据库里手动执行sql看有结果没
zk0233 2020-05-12
  • 打赏
  • 举报
回复
我也想过用其它方法替换NHibernate取数据的方法,但整个项目看了一下,需要改动地方太多,放弃了。 再等等看吧,情况再次出现时,看看日志的里记录些什么吧。如果真的什么也没记录,我再把正常和异常的所有时候,都记录在日志里。或者我在return item;这个返回值为null时,再记录日志。
闭包客 2020-05-05
  • 打赏
  • 举报
回复
这种下拉菜单为空的问题,有可能是前端脚本错误,也有可能是缓存同步的问题,还有可能是 SQL 异常被捕获之后返回的空数据。 如果是重启服务器之后问题可以解决的话,那是可以排除前端脚本的问题的。 日志的记录,是记录出问题的时候各个环节的状态。在你这个例子里面,就是下拉菜单为空的时候,各个环节的状态。你所做的日志并不是下拉菜单为空的这个时间点,所以即使日志上面有记录,你也定位不了问题的所在。 你所写的 try catch 块,是背离你的初衷的,如果函数已经顺利地返回值,那么它就不会抛出异常。 我建议是下拉菜单每一次显示的时候都要记录日志,而不是只在有异常信息的时候才记录,因为只要一个网页的响应头是200,那么在这个响应的过程中,就是没有异常信息,或者在某个流程已经捕获过了。
哎算了 2020-05-04
  • 打赏
  • 举报
回复
如果涉及数据库读取菜单,比如无限级分类,我一般都是生成静态JSON,这样既能节约服务器性能,又可以加快访问速度,如果改动了,后台重新生成一下。尤其访问量大,菜单下级多,提升越明显。

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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