[英]Can an NHibernate session have two data readers open in separate threads?
我想知道使用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
对象。 这是正确的方法,还是我做错了什么。 注意,我只想要一个到数据库的单一开放连接。 另外,请记住后台线程只加载数据而不是其他内容,因此我不担心隔离级别和数据在读取时会发生变化。
会话与线程绑定,创建的命令链接到会话连接对象。 所以,是的,如果在打开的阅读器存在时执行提交或关闭,您将获得异常。
您可以加入()您的线程并等待所有完成后再关闭/提交。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.