iBATIS.. NET WebSessionStore抛出异常

本文关键字:抛出异常 WebSessionStore NET iBATIS | 更新日期: 2023-09-27 18:17:33

我有一个使用iBATIS的web应用程序。网络图书馆。

DAO是通过使用XmlDocument配置的,因此代码与文档中显示的非常相似:

XmlDocument anXmlDoc = someSupportClass.GetDynamicXmlDocument();
DomDaoManagerBuilder builder = new DomDaoManagerBuilder();
builder.Configure(anXmlDoc);

文档下面说:

从dao构建的DaoManager实例。配置文件是感知的配置文件中包含的所有上下文的。的上下文基本上将DAO实现与会话捆绑在一起处理程序。DaoManager知道哪些dao和会话处理程序属于哪个dao上下文。当你从DAO管理器请求一个DAO实例时,它将提供适当的会话处理程序。因此,有不需要直接访问上下文或会话处理程序。你的刀知道怎么用

这似乎不是真的。在线程进程中,会随机抛出以下异常:

WebSessionStore:无法获得HttpContext的引用IBatisNet.DataAccess.SessionStore.WebSessionStore.ObtainSessionContext ()在IBatisNet.DataAccess.SessionStore.WebSessionStore.get_LocalSession ()
在ibatisnet . dataaccess . daomemanager . isdaosessionstarted (IBatisNet.DataAccess.Configuration.DaoProxy.Intercept (IInvocation调用对象[]参数)

应用程序可以正常运行几天甚至几个月,但是每隔一段时间就会抛出这个异常。我在任何地方都能找到的唯一解决方案是将SessionStore替换为HybridWebThreadSessionStore(此处提到)。

正如上面的文档所说,这应该是不必要的。如果我想强制它,我该如何重写由DomDaoManagerBuilder创建的SessionStore呢?

iBATIS.. NET WebSessionStore抛出异常

这个问题似乎是由iBatis中的竞争条件引起的。. NET框架。如果在主线程上调用数据库,然后在单独的线程上调用数据库,那么单独的线程将引发错误,因为它们没有在SessionStore中存储HttpContext。

基本上是Startup -> db call on main thread -> db call on separate thread

本应是Startup -> db call on separate thread -> db call on main thread

基本上,我只是改变了事件触发的顺序,以确保线程上的db调用至少在主线程上的任何事情发生之前被调用一次。

这篇文章描述了同样的问题

的设置

在我的全局。然后,我用Timer启动了一个后台进程类。这个Timer类使用委托DoTimerBasedStuff(),它是定期打电话。DoTimerBasedStuff()方法访问两个不同的数据库,MySQL和SQL Server。两者都是正确设置的使用MySQLMapper和SQLServerMapper类。

除了几个这样的后台线程,应用程序也有一个web前端访问两个数据库使用典型的。aspx从Page继承的页面和类。没有什么幻想。

的问题

如果应用程序是通过索引启动的。使用Aspx浏览器(该页不做任何db的东西,但触发全局。asax),没有在第一次调用DoTimerBasedStuff()之前,会执行其他操作一切都很好,后台进程和web用户都很好很好。IBatis做的一切都是对的。

但是如果我通过索引来启动应用程序。然后是Aspx立即通过访问数据库的网络做一些工作(之前)DoTimerBasedStuff()被执行),DoTimerBasedStuff()方法有无法访问HttpContext,并给出以下错误:

异常:WebSessionStore: Could not get reference to HttpContext在IBatisNet.DataMapper.SessionStore.WebSessionStore.ObtainSessionContext ()在IBatisNet.DataMapper.SessionStore.WebSessionStore.get_LocalSession ()在IBatisNet.DataMapper.SqlMapper.QueryForObject(字符串…

出现错误是因为您在不同的线程中运行ibatis。你可以在对数据库进行查询之前使用HybridWebThreadSessionStore的一个新实例。

var map = new Hashtable
{
   { "FilterA", "MyFilter" }
};
SqlMap.SessionStore = new HybridWebThreadSessionStore(SqlMap.Id);
var listadoJobs = SqlMap.QueryForList<EventoJob>(SbsIbatisConstantes.ListarJobs, map).ToList();

你可以在这里查看这个参考