首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iBATIS.NET WebSessionStore引发异常

iBATIS.NET WebSessionStore引发异常
EN

Stack Overflow用户
提问于 2014-08-11 15:37:31
回答 2查看 1.1K关注 0票数 0

我有一个使用iBATIS.NET库的web应用程序。

DAO是通过使用XmlDocument配置的,因此代码非常类似于它们在文档中显示的内容:

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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 .

票数 1
EN

Stack Overflow用户

发布于 2019-04-26 00:21:12

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

代码语言:javascript
复制
var map = new Hashtable
{
   { "FilterA", "MyFilter" }
};
SqlMap.SessionStore = new HybridWebThreadSessionStore(SqlMap.Id);
var listadoJobs = SqlMap.QueryForList<EventoJob>(SbsIbatisConstantes.ListarJobs, map).ToList();

您可以检查此参考这里

对我起作用了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25247079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档