NHibernate会话不是缓存

时间:2011-08-31 20:09:20

标签: nhibernate

我对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方法时,无论如何都会命中数据库?感谢

1 个答案:

答案 0 :(得分:4)

当您使用Id之外的其他内容进行查询时,NHibernate将不会使用第一级缓存。换句话说,获取和加载将查看第一级缓存,但按名称搜索的ICriteria将转到数据库。您可以使用2nd level NHibernate cache或实施自己的缓存。

作为旁注,你似乎也有这条线的竞争条件:

if (_sessionFactory == null)

多个线程可能会将_sessionFactory视为null并继续创建它两次。