1

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

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,但该更改只会降低超时错误的频率。

调试后,我发现 IList matchingObjects = criteria.List(); 是异常的原因。但这仅返回一个值,因此它不应该导致超时错误,因为到目前为止表也不包含超过 100 行。有什么建议么??

4

1 回答 1

1

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

理论上,在 RetrieveEquals() 中的会话查询可能会因为调用方法中使用的连接上的锁而阻塞。但是鉴于所示的代码,我看不到任何证明这一点的东西。

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

您还说“在两个或三个查询之后”...您是否暗示某处有一个未显示的循环?

于 2013-02-06T12:35:27.067 回答