- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
注意:既然我已经输入了这个,我不得不为这个超长的问题道歉,但是,我认为这里提供的所有代码和信息在某种程度上都是相关的。
好的,我在我的 ASP.NET webforms 应用程序中随机出现奇怪的“Session Is Closed”错误。然而,今天,它终于一次又一次地发生在同一个地方。我几乎可以肯定,我的代码中没有处理或关闭 session ,因为使用的代码位与所有其他代码完全分开,如下所示。
我也在使用 ninject 作为我的 IOC,这可能/可能不重要。
好的,所以,首先是我的 SessionFactoryProvider
和 SessionProvider
类:
SessionFactoryProvider
public class SessionFactoryProvider : IDisposable
{
ISessionFactory sessionFactory;
public ISessionFactory GetSessionFactory()
{
if (sessionFactory == null)
sessionFactory =
Fluently.Configure()
.Database(
MsSqlConfiguration.MsSql2005.ConnectionString(p =>
p.FromConnectionStringWithKey("QoiSqlConnection")))
.Mappings(m =>
m.FluentMappings.AddFromAssemblyOf<JobMapping>())
.BuildSessionFactory();
return sessionFactory;
}
public void Dispose()
{
if (sessionFactory != null)
sessionFactory.Dispose();
}
}
SessionProvider
public class SessionProvider : IDisposable
{
ISessionFactory sessionFactory;
ISession session;
public SessionProvider(SessionFactoryProvider sessionFactoryProvider)
{
this.sessionFactory = sessionFactoryProvider.GetSessionFactory();
}
public ISession GetCurrentSession()
{
if (session == null)
session = sessionFactory.OpenSession();
return session;
}
public void Dispose()
{
if (session != null)
{
session.Dispose();
}
}
}
这两个类与 Ninject 是这样连接的:
NHibernateModule
public class NHibernateModule : StandardModule
{
public override void Load()
{
Bind<SessionFactoryProvider>().ToSelf().Using<SingletonBehavior>();
Bind<SessionProvider>().ToSelf().Using<OnePerRequestBehavior>();
}
}
据我所知,工作符合预期。
现在我的BaseDao<T>
类:
BaseDao
public class BaseDao<T> : IDao<T> where T : EntityBase
{
private SessionProvider sessionManager;
protected ISession session { get { return sessionManager.GetCurrentSession(); } }
public BaseDao(SessionProvider sessionManager)
{
this.sessionManager = sessionManager;
}
public T GetBy(int id)
{
return session.Get<T>(id);
}
public void Save(T item)
{
using (var transaction = session.BeginTransaction())
{
session.SaveOrUpdate(item);
transaction.Commit();
}
}
public void Delete(T item)
{
using (var transaction = session.BeginTransaction())
{
session.Delete(item);
transaction.Commit();
}
}
public IList<T> GetAll()
{
return session.CreateCriteria<T>().List<T>();
}
public IQueryable<T> Query()
{
return session.Linq<T>();
}
}
像这样在 Ninject 中绑定(bind):
DaoModule
public class DaoModule : StandardModule
{
public override void Load()
{
Bind(typeof(IDao<>)).To(typeof(BaseDao<>))
.Using<OnePerRequestBehavior>();
}
}
现在导致此问题的网络请求是在我保存对象时发生的,直到我今天对模型进行了一些更改后才发生,但是对我的模型所做的更改无论如何都没有更改数据访问代码。虽然它改变了一些 NHibernate 映射(如果有人感兴趣,我也可以发布这些)
据我所知,BaseDao<SomeClass>.Get
然后被称为BaseDao<SomeOtherClass>.Get
然后被称为BaseDao<TypeImTryingToSave>.Save
被称为。
这是 Save()
行的第三次调用
using (var transaction = session.BeginTransaction())
失败并显示“ session 已关闭!”或者更确切地说是异常(exception):
Session is closed!
Object name: 'ISession'.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.ObjectDisposedException: Session is closed!
Object name: 'ISession'.
确实在调试器上进行的后续操作显示第三次从 SessionProvider
请求 session 它确实是关闭的,没有连接。
我已验证 Dispose
在我的 SessionFactoryProvider
在我的 SessionProvider
上在请求结束时调用,而不是在 Save
之前调用在我的 Dao 上进行调用。
所以现在我有点卡住了。我想到了一些事情。
提前致谢
最佳答案
ASP.NET 是多线程的,因此对 ISession 的访问必须是线程安全的。假设您正在使用每次请求 session ,最简单的方法是使用 NHibernate 的内置处理 contextual sessions .
首先配置 NHibernate 以使用 web session 上下文类:
sessionFactory = Fluently.Configure()
.Database(
MsSqlConfiguration.MsSql2005.ConnectionString(p =>
p.FromConnectionStringWithKey("QoiSqlConnection")))
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<JobMapping>())
.ExposeConfiguration(x => x.SetProperty("current_session_context_class", "web")
.BuildSessionFactory();
然后使用 ISessionFactory.GetCurrentSession()
获取现有 session ,如果不存在,则将新 session 绑定(bind)到工厂。下面我将剪切和粘贴用于打开和关闭 session 的代码。
public ISession GetContextSession()
{
var factory = GetFactory(); // GetFactory returns an ISessionFactory in my helper class
ISession session;
if (CurrentSessionContext.HasBind(factory))
{
session = factory.GetCurrentSession();
}
else
{
session = factory.OpenSession();
CurrentSessionContext.Bind(session);
}
return session;
}
public void EndContextSession()
{
var factory = GetFactory();
var session = CurrentSessionContext.Unbind(factory);
if (session != null && session.IsOpen)
{
try
{
if (session.Transaction != null && session.Transaction.IsActive)
{
session.Transaction.Rollback();
throw new Exception("Rolling back uncommited NHibernate transaction.");
}
session.Flush();
}
catch (Exception ex)
{
log.Error("SessionKey.EndContextSession", ex);
throw;
}
finally
{
session.Close();
session.Dispose();
}
}
}
关于c# - NHibernate 和奇数 "Session is Closed!"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2572015/
我的任务是编写一个java程序,首先询问用户将输入多少个数字,然后输出输入的奇数和偶数个数。它限制为整数 0-100。我的问题是:我的代码中缺少什么? import java.util.Scanner
我正在寻找有关 VBA 脚本的帮助。我一直在试图弄清楚如何使用 mod 功能。 这是我到目前为止所做的: Function AddOddNumbersWithMod(nr) Dim i, su
我只是想从 .NET 调用 kernel32 中的 GetPrivateProfileString 和 GetPrivateProfileSection,但遇到了一些我不明白的奇怪问题。 让我们从这个
我需要做的是在列表中交替应用 2 个函数。例如: (*2) (-3) [4,5,6,7,8] 会导致[8,2,12,4,16] , 因为 4*2 , 5-3 , 6*2 , 7-3 , 8*2 ...
我尝试在 JavaScript 中创建一个函数来判断一个数字是否为偶数,或者它是否是一个数字。我收到此错误: 这是 CodeCademy 中的类(class)。 最佳答案 您正在检查函数 isNaN
当我运行此命令时,不会打印任何内容,我尝试根据用户输入的内容打印一条消息,显示奇数或偶数。 import java.util.Scanner; public class Questions {
我必须编写一个程序来读取 3 个数字(使用输入框),并根据它们的值写入以下消息之一: 所有 3 个数字都是奇数或 所有 3 个数字都是偶数或 2 个数字是奇数,1 个数字是偶数或 1 个数字是奇数
我正在构建一个谷歌图像搜索的示例。我有一个图像网格(搜索结果)。当单击其中一张图像时,我正在使用 jquery 创建的部分标记中加载 html 文档。奇怪的是,如果你查看开发人员工具,html 已加载
我试图仅在偶数行上打印单词 * Even * ,而不包括第一行和第二行(最终不包括最后两行),但它打印 15 行,然后在整个过程中随机打印 * Even * 。使用 6 表示宽度,使用 15 表示高度
我有一个数学函数,它取决于由 给出的三个变量 {n、a 和 b} {a = n+1, b=n} 当 n 为偶数时 {b = n+1, a=n} 当 n 为奇数时 我的函数被调用了很多 次,n 各不相同
我有一个查询,其中有一个条件来检查房间号是否为奇数/偶数。问题在于房间号与建筑物信息一起存储在字符串中。 以下是数据库中数据的格式: ABC-0101A (Odd) ABC-0112B (Even
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我有一个包含类似内容的页面。 ################################# # __________________________ # # | |
这个问题在这里已经有了答案: Can I combine :nth-child() or :nth-of-type() with an arbitrary selector? (9 个回答) Ho
我正在尝试了解这个素数分解的特定解决方案(取自 http://rosettacode.org/wiki/Prime_decomposition#Python:_Using_floating_point
我知道这可能是一个愚蠢而简单的问题,但我对编程还很陌生。我有以下关于我在一个程序中看到的 if 运算符的问题。这是代码: d= -12.4; if(d) printf("%d \n", abs
我正在尝试制作一个脚本,根据天气情况输出用户名,他们被分配奇数或偶数值。我想我已经设法让奇数的工作,但偶数的不会输出。这是它的样子。 'commentid' 是确定将它们分配给奇数还是偶数的值。 ";
我的 NPE 的 Stacktrace 开始于: Caused by: java.lang.NullPointerException at pl.yourvision.crm.web.serv
我正在尝试查找给定数字(用户输入)是偶数还是奇数。 I'm simply applying AND operation on binary digits of a no. with 1, If the
有谁知道用于可变范围的桶的哈希函数(对于字符串,如果它重要的话),它总是奇数(或质数,如果需要的话)? 本质上,我正在寻找一个散列函数,它将在 n 个桶上提供均匀分布,其中 n 是奇数(或质数,因为
我是一名优秀的程序员,十分优秀!