我想知道使用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
对象。这是正确的方法,还是我做错了什么。注意,我只想要一个到数据库的单一开放连接。另外,请记住后台线程只是加载数据而没有别的,所以我不担心隔离级别和数据在读取时会发生变化。
答案 0 :(得分:3)
会话与线程绑定,创建的命令链接到会话连接对象。所以,是的,如果在打开的阅读器存在时执行提交或关闭,您将获得异常。
你可以加入()你的线程,等到关闭/提交之前一切都完成。