NHibernate会话可以在不同的线程中打开两个数据读取器吗?

时间:2014-01-03 20:58:52

标签: c# .net nhibernate fluent-nhibernate

我想知道使用NHibernate运行两个同时查询的正确方法。现在,我有一个ISession对象用于我的所有查询:

session = sessionFactory.OpenSession();

在一个线程中,我正在加载一些需要10-15秒的数据,但是我不需要它,所以我不想在加载时阻止整个程序:

IDbCommand cmd = session.Connection.CreateCommand();
cmd.CommandType = CommandType.TableDirect;
cmd.CommandText = "RecipesForModelingGraph";
IDataReader reader = cmd.ExecuteReader();

while (reader.Read())
{
   // Do stuff
}

reader.Close();

这样可以正常工作,但是在另一个线程中,我可能正在运行查询,例如:

var newBlah = new Blah();
session.Save(newBlah);

当上述事务提交时,我偶尔会遇到异常:

  

其他信息:已经有一个开放的DataReader关联   使用此命令必须先关闭。

现在,我想也许这是因为我在同一个交易中运行了所有内容。所以,我用我的所有加载代码包围了:

using (ITransaction transaction = session.BeginTransaction(IsolationLevel.Serializable))
{
   // Same DataReader code as above
}

然而,问题并没有消失。我想也许我需要每个线程拥有自己的ISession对象。这是正确的方法,还是我做错了什么。注意,我只想要一个到数据库的单一开放连接。另外,请记住后台线程只是加载数据而没有别的,所以我不担心隔离级别和数据在读取时会发生变化。

1 个答案:

答案 0 :(得分:3)

会话与线程绑定,创建的命令链接到会话连接对象。所以,是的,如果在打开的阅读器存在时执行提交或关闭,您将获得异常。

你可以加入()你的线程,等到关闭/提交之前一切都完成。