我使用条件根据唯一键查询数据库。但我经历了一个奇怪的场景。经过两三次查询,它开始给我超时过期错误。
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行。任何建议??
答案 0 :(得分:1)
除非你将NHibernate的ISessionFactory包装在其他东西中,否则每次调用OpenSession()都会产生一个新的会话。所以上面的代码涉及多个会话,目前尚不清楚是否需要这样做。
理论上,由于对调用方法中使用的连接采取了锁定,因此对RetrieveEquals()中的会话的查询可能会阻塞。但鉴于所显示的代码,我无法看到任何证明这一点。
调用方法首先更新cashActivity的属性,然后在某些情况下继续删除对象。而且没有Commit()。这看起来很奇怪 - 这真的是用过的代码还是可能有复制/粘贴错误?
你也说“经过两三次查询”......你是否暗示某个地方有一个未显示的循环?