ibatis-user-cs mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Clinton Begin" <clinton.be...@gmail.com>
Subject Re: iBATIS read/write non-serialize cache
Date Tue, 13 May 2008 17:43:00 GMT
Oooohhh....   So here's the thing...

If you tell iBATIS that:

A) The objects in the cache will be tinkered with (i.e. read-write,
NOT read-only), and
B) The objects are not serializable....

iBATIS has no choice but to localize the cache to your current
session.  That said, it should be the session scope (thread/web
request etc.), not the iBATIS request scope... Gilles (or anyone on
the .NET team)?

* If you want this cache to be shared among multiple users, and the
objects are meant to be updated/changed, then set readOnly= false and
serializable=true.

* If the objects are strictly read-only (immutable by design or by
practice, shared or othewise), then set read-only=true and
serializable=false.

* If this cache is only for your current session/user's current web
request (not to be confused with iBATIS' request scope --different),
or your read-write classes are simply not serializable, then I think
your configuration is right, but Gilles and the .NET team need to
either change that cacheKey.update(request.SessionScope) or explain
their thinking behind its being request scope.

I hope that makes sense, sorry for the complexity here.  We hope to
improve cache configuration in future versions.

You did a great job tracking down the cause though.  Nice work.  :-)

Clinton

On Tue, May 13, 2008 at 11:26 AM, Eva Kwan <Eva.Kwan@huskyenergy.com> wrote:
> Adding a parameter didn't seem to help.
>
>  I'm using version 1.6.1.  When I trace through the iBATIS source, CachingStatement seems
to be using the RequestScope as a part of the key for my configuration, and the hashcode for
request is different for each of my select calls.
>
>                 private CacheKey GetCacheKey(RequestScope request)
>                 {
>                         ...
>
>                         if (!cacheModel.IsReadOnly && !cacheModel.IsSerializable)
>                         {
>                                 cacheKey.Update(request);
>                         }
>                         return cacheKey;
>                 }
>
>  Thanks,
>  Eva
>
>
>
>
>  -----Original Message-----
>  From: Clinton Begin [mailto:clinton.begin@gmail.com]
>  Sent: Tuesday, May 13, 2008 11:14 AM
>  To: user-cs@ibatis.apache.org
>  Subject: Re: iBATIS read/write non-serialize cache
>
>  I think it might be the case of "no parameters"...   for kicks, add a
>  parameter to the query to see if that helps.  a simple
>  parameterClass="int" should works.
>
>  Also, which version are you using?  I thought this was fixed...
>
>  Clinton
>
>  On Tue, May 13, 2008 at 11:02 AM, Eva Kwan <Eva.Kwan@huskyenergy.com> wrote:
>  >
>  >
>  >
>  >
>  > I have a cache model set up like this:
>  >
>  >
>  >
>  >     <cacheModel id="FindAllCache" implementation="LRU" readOnly="false">
>  >
>  >       <flushInterval minutes="5"/>
>  >
>  >       <property name="CacheSize" value="2"/>
>  >
>  >     </cacheModel>
>  >
>  >
>  >
>  >     <select id="FindAll" extends="Base" resultMap="Result"
>  > cacheModel="FindAllCache">
>  >
>  >     </select>
>  >
>  >
>  >
>  > I have turned on iBATIS logging.  When I execute the select statement more
>  > than once within one session, the logs say that there is a cache miss each
>  > time.
>  >
>  >
>  >
>  > How do I get a read/write (per session) cache to work?
>

Mime
View raw message