簡體   English   中英

NHibernate會話可以在不同的線程中打開兩個數據讀取器嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM