我有一个使用iBATIS.NET库的web应用程序。
DAO是通过使用XmlDocument配置的,因此代码非常类似于它们在文档中显示的内容:
XmlDocument anXmlDoc = someSupportClass.GetDynamicXmlDocument();
DomDaoManagerBuilder builder = new DomDaoManagerBuilder();
builder.Configure(anXmlDoc);文件中的内容如下:
从一个DaoManager文件构建的dao.config实例知道配置文件中包含的所有上下文。上下文基本上将DAO实现与会话处理程序捆绑在一起。DaoManager知道哪个DAO和会话处理程序属于哪个上下文。当您从DaoManager请求DAO实例时,将提供适当的会话处理程序。因此,不需要直接访问上下文或会话处理程序。你的刀知道它是怎么工作的。
这似乎不是真的。在线程进程中,随机抛出以下异常:
IBatisNet.DataAccess.SessionStore.WebSessionStore.ObtainSessionContext() at IBatisNet.DataAccess.SessionStore.WebSessionStore.get_LocalSession()的WebSessionStore:无法获得对HttpContext的引用 在IBatisNet.DataAccess.DaoManager.IsDaoSessionStarted() at IBatisNet.DataAccess.Configuration.DaoProxy.Intercept(IInvocation调用时,Object[]参数)
应用程序一次可以运行几天甚至几个月,但每隔一段时间就会引发此异常。我在任何地方都能找到的唯一解决方案是将SessionStore替换为HybridWebThreadSessionStore (这里提到的)。
正如上面的文档所述,这不应该是必要的。但是,如果我想强制执行它,我将如何重写由SessionStore创建的DomDaoManagerBuilder
发布于 2014-12-31 18:29:08
当应用程序启动时,这个问题似乎是由iBatis.NET框架中的争用条件引起的。如果在对数据库的调用发生在单独的线程上之前,对数据库的调用是在主线程上进行的,那么单独的线程将引发错误,因为它们没有将HttpContext存储在SessionStore中。
基本上是Startup -> db call on main thread -> db call on separate thread
当它应该是Startup -> db call on separate thread -> db call on main thread
基本上,我只是改变了事件触发的顺序,以确保在主线程发生任何事情之前至少调用线程上的db调用一次。
这篇文章描述了同样的问题。
设置 在我的Global.asax中,我使用Timer类启动后台进程。这个计时器类使用定期调用的delgate DoTimerBasedStuff()。DoTimerBasedStuff()方法访问两个不同的数据库,MySQL和Server。这两个类都是使用它们的MySQLMapper和SQLServerMapper类正确设置的。 除了其中的几个后台线程之外,应用程序还有一个web前端,它使用典型的.aspx页面和从Page继承的类访问数据库。没什么花哨的。 问题 如果应用程序是通过使用浏览器进入index.aspx启动的(此页面不执行任何数据库内容,而是触发Global.asax),并且在第一次调用DoTimerBasedStuff()之前不会采取任何其他操作,并且后台进程和web用户都很好。IBatis做的一切都是对的。 但是,如果我通过index.aspx启动应用程序,然后立即通过访问数据库的web进行一些工作(在执行DoTimerBasedStuff()之前),则DoTimerBasedStuff()方法在访问HttpContext时会遇到问题,并给出以下错误: 例外情况: IBatisNet.DataMapper.SessionStore.WebSessionStore.ObtainSessionContext() at IBatisNet.DataMapper.SessionStore.WebSessionStore.get_LocalSession() at IBatisNet.DataMapper.SqlMapper.QueryForObject(String .
发布于 2019-04-26 00:21:12
发生此错误是因为您在不同的线程中运行in。您可以在对数据库进行查询之前使用HybridWebThreadSessionStore的一个新实例。
var map = new Hashtable
{
{ "FilterA", "MyFilter" }
};
SqlMap.SessionStore = new HybridWebThreadSessionStore(SqlMap.Id);
var listadoJobs = SqlMap.QueryForList<EventoJob>(SbsIbatisConstantes.ListarJobs, map).ToList();您可以检查此参考这里
对我起作用了。
https://stackoverflow.com/questions/25247079
复制相似问题