我对Nhibernate相对较新,我遇到了缓存会话中实体的问题(第一级缓存) 这是我的代码
public Book IProductRepository.GetBookbyName(string bookName)
{
ISession session = NHibernateHelper.GetSession();
ICriteria criteria = session.CreateCriteria<Book>()
.Add(Restrictions.Eq("Name", bookName));
return criteria.UniqueResult<Book>();
}
和
private static ISessionFactory _sessionFactory;
private static ISessionFactory SessionFactory
{
get
{
if (_sessionFactory == null)
{
var configuration = new Configuration();
configuration.Configure();
configuration.AddAssembly(typeof(Product).Assembly);
_sessionFactory = configuration.BuildSessionFactory();
CurrentSessionContext.Bind(_sessionFactory.OpenSession());
}
return _sessionFactory;
}
}
public static ISession GetSession()
{
return SessionFactory.GetCurrentSession();
}
,配置文件是
<session-factory>
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="connection.connection_string">Server=(local);initial catalog=NhibernateTest;Integrated Security=SSPI</property>
<property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
<property name ="current_session_context_class">thread_static</property>
<property name="cache.use_query_cache" >true</property>
<property name="show_sql">true</property>
每当我调用GetBookByName方法时,无论如何都会命中数据库?感谢
答案 0 :(得分:4)
当您使用Id之外的其他内容进行查询时,NHibernate将不会使用第一级缓存。换句话说,获取和加载将查看第一级缓存,但按名称搜索的ICriteria将转到数据库。您可以使用2nd level NHibernate cache或实施自己的缓存。
作为旁注,你似乎也有这条线的竞争条件:
if (_sessionFactory == null)
多个线程可能会将_sessionFactory视为null并继续创建它两次。