1

基準を使用して、一意のキーに基づいてデータベースをクエリしています。しかし、私は奇妙なシナリオを経験しています。2つまたは3つのクエリの後、タイムアウトの期限切れエラーが発生し始めます。

using (NHibernate.ISession session = m_SessionFactory.OpenSession())
{
  using (ITransaction transacion = session.BeginTransaction())
  {
    if (cashActivity.ActivityState == ApplicationConstants.TaxLotState.Deleted ||        cashActivity.ActivityState == ApplicationConstants.TaxLotState.Updated)
     {
       IList<CashActivity> lsCActivity = RetrieveEquals<CashActivity>("UniqueKey",cashActivity.UniqueKey);
       if (lsCActivity != null && lsCActivity.Count > 0)
       cashActivity.CashActivityID = lsCActivity[0].CashActivityID;
     }

     if (cashActivity.ActivityState == ApplicationConstants.TaxLotState.Deleted)
     {
       session.Delete(cashActivity);
     }
     else
       session.SaveOrUpdate(cashActivity);
   }
  }
}

  public IList<T> RetrieveEquals<T>(string propertyName, object propertyValue)
  {
     using (Isession session = m_SessionFactory.OpenSession())
     {
         Icriteria criteria = session.CreateCriteria(typeof(T));
         criteria.Add(Restrictions.Eq(propertyName, PropertyValue));

         IList<T> matchingObjects = criteria.List<T>();

         return matchingObjects;
     }
  }

コードに変更を加えてStateLessSessionの使用を開始しましたが、その変更によってタイムアウトエラーの頻度が減るだけです。

decuggingした後、私はIList matchingObjects = Criteria.List();を見つけました。例外の原因です。ただし、これは1つの値のみを返すため、テーブルにも現在100行を超える行が含まれていないため、タイムアウトエラーが発生することはありません。助言がありますか??

4

1 に答える 1

1

NHibernateのISessionFactoryを別のものでラップしていない限り、OpenSession()を呼び出すたびに新しいセッションが生成されます。したがって、上記のコードには複数のセッションが含まれており、これが必要かどうかは明確ではありません。

理論的には、RetrieveEquals()のセッションに対するクエリは、呼び出し元のメソッドで使用される接続がロックされているためにブロックされる可能性があります。しかし、示されているコードを考えると、これを証明するものは何も見えません。

呼び出し元のメソッドは、最初にcashActivityのプロパティを更新し、次にオブジェクトを削除する場合があります。そして、Commit()はありません。これは奇妙に思えます-これは本当に使用されているコードですか、それともコピー/貼り付けエラーがある可能性がありますか?

また、「2、3回のクエリの後」と言います...どこかに表示されていないループがあることを意味しますか?

于 2013-02-06T12:35:27.067 に答える