Clinton Begin
Tue, 13 May 2008 10:43:32 -0700
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 <[EMAIL PROTECTED]> 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 [EMAIL PROTECTED]
> 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 <[EMAIL PROTECTED]> 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?
>