2011-08-31 1 views
3

Je suis relativement nouveau pour Nhibernate et j'ai un problème de mise en cache des entités dans la session (première cache de niveau) Voici mon codesession de NHibernate n'est pas mise en cache

public Book IProductRepository.GetBookbyName(string bookName) 
{ 
     ISession session = NHibernateHelper.GetSession(); 
     ICriteria criteria = session.CreateCriteria<Book>() 
            .Add(Restrictions.Eq("Name", bookName)); 
     return criteria.UniqueResult<Book>(); 
} 

et

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

et le fichier de configuration est

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

et chaque fois que je l'appelle méthode GetBookByName, il frappe la base de données, peu importe quoi? Merci

+1

pour une réponse à votre question, voir [cette question] [1]. aussi, j'ai remarqué que vous semblez créer une nouvelle session une seule fois, lors de la création de 'ISessionFactory'. Les sessions doivent être créées par appel et non par application. [1]: http://stackoverflow.com/questions/4919636/can-first-level-cache-be-used-with-icriteria-or-other-apis –

Répondre

4

NHibernate n'utilisera pas le cache de premier niveau lorsque vous interrogez autre chose que l'ID. En d'autres termes, Gets and Loads se penchera sur le cache de premier niveau, mais ICriteria effectuera une recherche par Name dans la base de données. Vous pouvez utiliser 2nd level NHibernate cache ou implémenter votre propre mise en cache.

En marge, vous semblez aussi avoir une condition de course à cette ligne:

if (_sessionFactory == null) 

Plusieurs threads peuvent potentiellement voir _sessionFactory comme nulle et procéder à la création deux fois.

+1

+1 en condition de concurrence. Cela m'a vissé plusieurs fois. 'Lazy ' à la rescousse! Le double contrôle est inclus! – Jeff

Questions connexes