使用nhibernate查询条件时超时已过期

时间:2013-02-03 13:57:41

标签: nhibernate

我使用条件根据唯一键查询数据库。但我经历了一个奇怪的场景。经过两三次查询,它开始给我超时过期错误。

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;
     }
  }

我在代码中进行了更改并开始使用StateLess Session,但这种更改只会降低超时错误的频率。

在decugging之后,我发现了IList matchingObjects = criteria.List();是例外的原因。但是这只返回一个值,所以它不应该导致超时错误,因为表目前还不包含超过100行。任何建议??

1 个答案:

答案 0 :(得分:1)

除非你将NHibernate的ISessionFactory包装在其他东西中,否则每次调用OpenSession()都会产生一个新的会话。所以上面的代码涉及多个会话,目前尚不清楚是否需要这样做。

理论上,由于对调用方法中使用的连接采取了锁定,因此对RetrieveEquals()中的会话的查询可能会阻塞。但鉴于所显示的代码,我无法看到任何证明这一点。

调用方法首先更新cashActivity的属性,然后在某些情况下继续删除对象。而且没有Commit()。这看起来很奇怪 - 这真的是用过的代码还是可能有复制/粘贴错误?

你也说“经过两三次查询”......你是否暗示某个地方有一个未显示的循环?