Jason,
even you shouldn't have the cache defined in the mapping of the entity ;-)
http://fabiomaulo.blogspot.com/2009/07/nhibernate-configuration-cache.html

On Thu, Sep 30, 2010 at 2:26 PM, Jason Meckley <[email protected]>wrote:

> I don't follow. may be I should back up.
> what are you doing now? is it the code your originally posted? if not
> please post the actual code.
> what is happening?
> what do you want/expect to happen?
> what do you mean by cache? 1st level cache. also known as the identity
> map. or are you referring to 2nd level cache?
> I assume the 1st level cache, since you don't have caching enabled in
> the mapping.
>
> if the entity exists in the 1st level cache and you query the
> database, but the object already exists in the cache the cached object
> is returned, not the database object. have you run your application
> through nhprof? this will give you an excellent idea of what's going
> on.
>
> On Sep 30, 11:25 am, Yauhen <[email protected]> wrote:
> > Are there any way to do without additional hit on database? For
> > example to make evict by id?
> > Because first get seen to me redundant. I need only updated entity not
> > original. And method should be as
> >
> > session get (hit db)
> > session update
> > session evict (if you don't evict get pulls for 1st level cache)
> >
> > On Sep 30, 5:58 pm, Jason Meckley <[email protected]> wrote:
> >
> > > if the next call comes from the same session, then you need to evict
> > > the object. example:
> > > session open
> > > session get (hit db)
> > > session update
> > > session evict (if you don't evict get pulls for 1st level cache)
> > > session get (hit db)
> >
> > > if the the call comes from a completely different session then you
> > > don't need to do anything.
> > > session 1: open
> > > session 2: open
> > > session 2: get (hit db)
> > > session1: update
> > > session2: get (1st level cache)
> > > this is by design
> >
> > >  if you are expecting this:
> > > session 1: open
> > > session 2: open
> > > session 2: get (hit db)
> > > session1: update
> > > session2: get (hit db)
> > > ...
> > > it won't, not without evicting anyway. that is by design. there are 3
> > > options to handle that
> > > 1. pessimistic concurrency (lock the database row)
> > > 2. optimistic concurrency (versioning)
> > > 3. call evict on session 2
> >
> > > typically #2 provides better performance. it requires you to handle
> > > the StaleObjectException. #1 can result in command timeouts, so you
> > > would need to handle them as well. #3 goes against how NH is designed
> > > to operate. it's possible, but not advisable. also you cannot
> > > guarantee evict is called before session 1 update.
> >
> > > On Sep 30, 10:32 am, Yauhen <[email protected]> wrote:
> >
> > > > I simply need invalidate cache. So next call not get value fro cache
> > > > but from real database.
> >
> > > > On Sep 30, 5:27 pm, Roger Kratz <[email protected]> wrote:
> >
> > > > > I'm not sure I understand but...
> >
> > > > > << [...] Session is the same betwwen calls. [...]>>
> > > > > << [...] query.ExecuteUpdate(); [...] >>
> >
> > > > > Are you expecting your call to ExecuteUpdate to update the state
> inside your ISession? I don't think that will work.
> >
> > > > > Session keeps a first level cache. The state of this cache won't be
> updated when calling ExecuteUpdate AFAIK - no entities are returned.
> >
> > > > > /Roger
> >
> > > > > -----Original Message-----
> > > > > From: [email protected] [mailto:[email protected]]
> On Behalf Of Yauhen
> > > > > Sent: den 30 september 2010 16:10
> > > > > To: nhusers
> > > > > Subject: [nhusers] Re: NHibernate cache
> >
> > > > > so nobody has ideas?
> >
> > > > > On Sep 28, 12:50 pm, Yauhen <[email protected]> wrote:
> > > > > > I have found very strange effect when using nhibernate.
> > > > > > I am trying to do one clever update operation. Then read saved
> data
> > > > > > from database.
> > > > > > Operations are mostly based on sql queries. In database data are
> ok.
> > > > > > But by some strange reason nhibernate uses cached old data.
> > > > > > Operations are described like following:
> > > > > > <class name="Message"  table="Messages" >
> > > > > >                 <id name="Id" type="Int32" column="Id">
> > > > > >                         <generator class="identity"/>
> > > > > >                 </id>
> > > > > >                 <property name="Subject" column="Subject"
> type="String"/>
> > > > > >                 <property name="CategoryId" column="CategoryId"
> type="Int32"/>
> >
> > > > > > <sql-query name="Message.Delete">
> > > > > >     <synchronize table="Messages"/>
> > > > > >     UPDATE Messages
> > > > > >     SET CategoryId = (  /* long select to decide to which
> category to
> > > > > > move*/
> > > > > >                                )
> > > > > >      WHERE Id = :messageId
> > > > > >   </sql-query>
> >
> > > > > >  <sql-query name="Message.GetDetails">
> > > > > >     <return alias="msg" class="Message"/>
> > > > > >         SELECT  {msg.*}
> > > > > >         FROM Messages {msg}
> > > > > >         WHERE msg.Id = :messageId
> > > > > >   </sql-query>
> >
> > > > > > when calling delete/update query I use syntax like following
> > > > > >  using (ITransaction trans = _session.BeginTransaction())
> > > > > >             {
> > > > > >                 IQuery query =
> > > > > > _session.GetNamedQuery("Message.Delete");
> > > > > >                 query.SetParameter<IdT>(paramName, id);
> > > > > >                 query.ExecuteUpdate();
> > > > > >                 trans.Commit();
> >
> > > > > >                  _session.Flush();
> > > > > >             }
> > > > > > when calling read:
> > > > > > IQuery query = _session.GetNamedQuery("Message.GetDetails");
> > > > > > query.SetInt32("messageId", messageId);
> > > > > > query.List<Message>();
> >
> > > > > > Session is the same betwwen calls. Caching occurs somewhere
> inside
> > > > > > NHibernate.Loader
> >
> > > > > > obj = session.GetEntityUsingInterceptor(key);
> >
> > > > > --
> > > > > You received this message because you are subscribed to the Google
> Groups "nhusers" group.
> > > > > To post to this group, send email to [email protected].
> > > > > To unsubscribe from this group, send email to
> [email protected]<nhusers%[email protected]>
> .
> > > > > For more options, visit this group athttp://
> groups.google.com/group/nhusers?hl=en.
>
> --
> You received this message because you are subscribed to the Google Groups
> "nhusers" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected]<nhusers%[email protected]>
> .
> For more options, visit this group at
> http://groups.google.com/group/nhusers?hl=en.
>
>


-- 
Fabio Maulo

-- 
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/nhusers?hl=en.

Reply via email to