You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user-java@ibatis.apache.org by andrew cooke <an...@acooke.org> on 2008/06/02 23:23:21 UTC
No caching / validating cache
Hi,
I have a very simple system, with two tables, related 1:many, and
a single query which reads all entries from the outer join,
returning a list of objects each of which contains a list of
secondary objects from the "many" table.
This all works fine.
Now I have enabled caching, but am seeing:
1 - no difference in the logging
2 - different results if I repeat the query after modifying the
database by hand (indicating that the database is being re-read)
Note that in (2) the two reads are from the same Java thread,
which pauses in a Thread.sleep(30000) while I delete data by hand
using mysql from the command line. If caching was working I
would expect the second read (ie the second call to
sqlMap.queryForList) to return the same data as before, since
iBatis does not "know" I deleted rows from a table).
My Java code is read only - the only writing to the objects is
done bu iBatis during bean assembly - and I have specified
readOnly="true" on the cache.
So why isn't the select being cached? Alternatively, if it is
being cached, how do I verify it?
I will include some relevant parts from the config and logs
below. I tried serialize="true" too, just in case it would
help (my understanding is it should not be needed for
readOnly="true" and it made no difference).
Any help appreciated,
Thanks,
Andrew
<sqlMap namespace="kpi">
<resultMap id="kpi-result" class="com.isti.kpidb.domain.Kpi"
groupBy="id">
<result property="id" column="kpi.kpi_id"/>
<result property="title" column="kpi.title"/>
<result property="description" column="kpi.description"/>
<!-- this is the "many" defined elsewhere -->
<result property="slpis" resultMap="slpi.slpi-result"/>
</resultMap>
<cacheModel id="kpi-cache" type="LRU" readOnly="true" serialize="true">
<flushInterval hours="1"/>
<!-- the select returns 16 lines -->
<property name="size" value="20"/>
</cacheModel>
<select id="allKpis" resultMap="kpi-result" cacheModel="kpi-cache">
SELECT *
FROM kpis as kpi
LEFT OUTER JOIN slpis as slpi
ON kpi.kpi_id = slpi.kpi_id
</select>
</sqlMap>
and the db config is just:
<transactionManager type="JDBC" >
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="${driver}"/>
<property name="JDBC.ConnectionURL" value="${url}"/>
<property name="JDBC.Username" value="${username}"/>
<property name="JDBC.Password" value="${password}"/>
</dataSource>
</transactionManager>
The log looks liked this (even when the same query is re-run):
02-Jun-2008 17:13:34 com.ibatis.common.logging.jdk14.Jdk14LoggingImpl debug
FINE: Checked out connection 1420603736 from pool.
02-Jun-2008 17:13:34 com.ibatis.common.logging.jdk14.Jdk14LoggingImpl debug
FINE: {conn-100003} Connection
02-Jun-2008 17:13:34 com.ibatis.common.logging.jdk14.Jdk14LoggingImpl debug
FINE: {conn-100003} Preparing Statement: SELECT * FROM kpis as kpi
LEFT OUTER JOIN slpis as slpi ON kpi.kpi_id = slpi.kpi_id
02-Jun-2008 17:13:34 com.ibatis.common.logging.jdk14.Jdk14LoggingImpl debug
FINE: {pstm-100004} Executing Statement: SELECT * FROM kpis as kpi
LEFT OUTER JOIN slpis as slpi ON kpi.kpi_id = slpi.kpi_id
02-Jun-2008 17:13:34 com.ibatis.common.logging.jdk14.Jdk14LoggingImpl debug
FINE: {pstm-100004} Parameters: []
02-Jun-2008 17:13:34 com.ibatis.common.logging.jdk14.Jdk14LoggingImpl debug
FINE: {pstm-100004} Types: []
02-Jun-2008 17:13:34 com.ibatis.common.logging.jdk14.Jdk14LoggingImpl debug
FINE: {rset-100005} ResultSet
02-Jun-2008 17:13:34 com.ibatis.common.logging.jdk14.Jdk14LoggingImpl debug
FINE: {rset-100005} Header: [kpi.kpi_id, kpi.title, kpi.description,
slpi.slpi_id, slpi.title, slpi.description]
02-Jun-2008 17:13:34 com.ibatis.common.logging.jdk14.Jdk14LoggingImpl debug
FINE: {rset-100005} Result: [A, A, KPI A description, A1, A1, SLPI A1
description]
etc.
Re: No caching / validating cache
Posted by andrew cooke <an...@acooke.org>.
I should have said that I am using iBatis 2.3.2.715 on Linux x64 with Java 1.6
and MySQL 5.0.51a.
Cheers,
Andrew
Re: No caching / validating cache
Posted by Gwyn Evans <gw...@gmail.com>.
On Tue, Jun 3, 2008 at 12:05 AM, andrew cooke <an...@acooke.org> wrote:
> Christopher Lamey <clamey <at> localmatters.com> writes:
>> Do you have this attribute defined in the setting element:
>>
>> cacheModelsEnabled="true"
>>
>> In the sqlMapConfig file?
>
> i did not and you are a hero. it now works perfectly. thank-you!
>
> however THE FRIGGIN DOCS SAY THE DEFAULT IS TRUE ARRRRGGGGHH
>
> i know: i should have tried it anyway. sigh.
>
> thanks again,
> andrew
Just created https://issues.apache.org/jira/browse/IBATIS-513
/Gwyn
Re: No caching / validating cache
Posted by andrew cooke <an...@acooke.org>.
Christopher Lamey <clamey <at> localmatters.com> writes:
> Do you have this attribute defined in the setting element:
>
> cacheModelsEnabled="true"
>
> In the sqlMapConfig file?
i did not and you are a hero. it now works perfectly. thank-you!
however THE FRIGGIN DOCS SAY THE DEFAULT IS TRUE ARRRRGGGGHH
i know: i should have tried it anyway. sigh.
thanks again,
andrew
Re: No caching / validating cache
Posted by Christopher Lamey <cl...@localmatters.com>.
Do you have this attribute defined in the setting element:
cacheModelsEnabled="true"
In the sqlMapConfig file?
On 6/2/08 3:23 PM, "andrew cooke" <an...@acooke.org> wrote:
>
> Hi,
>
> I have a very simple system, with two tables, related 1:many, and
> a single query which reads all entries from the outer join,
> returning a list of objects each of which contains a list of
> secondary objects from the "many" table.
>
> This all works fine.
>
> Now I have enabled caching, but am seeing:
> 1 - no difference in the logging
> 2 - different results if I repeat the query after modifying the
> database by hand (indicating that the database is being re-read)
>
> Note that in (2) the two reads are from the same Java thread,
> which pauses in a Thread.sleep(30000) while I delete data by hand
> using mysql from the command line. If caching was working I
> would expect the second read (ie the second call to
> sqlMap.queryForList) to return the same data as before, since
> iBatis does not "know" I deleted rows from a table).
>
> My Java code is read only - the only writing to the objects is
> done bu iBatis during bean assembly - and I have specified
> readOnly="true" on the cache.
>
> So why isn't the select being cached? Alternatively, if it is
> being cached, how do I verify it?
>
> I will include some relevant parts from the config and logs
> below. I tried serialize="true" too, just in case it would
> help (my understanding is it should not be needed for
> readOnly="true" and it made no difference).
>
> Any help appreciated,
> Thanks,
> Andrew
>
> <sqlMap namespace="kpi">
>
> <resultMap id="kpi-result" class="com.isti.kpidb.domain.Kpi"
> groupBy="id">
> <result property="id" column="kpi.kpi_id"/>
> <result property="title" column="kpi.title"/>
> <result property="description" column="kpi.description"/>
> <!-- this is the "many" defined elsewhere -->
> <result property="slpis" resultMap="slpi.slpi-result"/>
> </resultMap>
>
> <cacheModel id="kpi-cache" type="LRU" readOnly="true" serialize="true">
> <flushInterval hours="1"/>
> <!-- the select returns 16 lines -->
> <property name="size" value="20"/>
> </cacheModel>
>
> <select id="allKpis" resultMap="kpi-result" cacheModel="kpi-cache">
> SELECT *
> FROM kpis as kpi
> LEFT OUTER JOIN slpis as slpi
> ON kpi.kpi_id = slpi.kpi_id
> </select>
>
> </sqlMap>
>
> and the db config is just:
>
> <transactionManager type="JDBC" >
> <dataSource type="SIMPLE">
> <property name="JDBC.Driver" value="${driver}"/>
> <property name="JDBC.ConnectionURL" value="${url}"/>
> <property name="JDBC.Username" value="${username}"/>
> <property name="JDBC.Password" value="${password}"/>
> </dataSource>
> </transactionManager>
>
> The log looks liked this (even when the same query is re-run):
> 02-Jun-2008 17:13:34 com.ibatis.common.logging.jdk14.Jdk14LoggingImpl debug
> FINE: Checked out connection 1420603736 from pool.
> 02-Jun-2008 17:13:34 com.ibatis.common.logging.jdk14.Jdk14LoggingImpl debug
> FINE: {conn-100003} Connection
> 02-Jun-2008 17:13:34 com.ibatis.common.logging.jdk14.Jdk14LoggingImpl debug
> FINE: {conn-100003} Preparing Statement: SELECT * FROM kpis as kpi
> LEFT OUTER JOIN slpis as slpi ON kpi.kpi_id = slpi.kpi_id
> 02-Jun-2008 17:13:34 com.ibatis.common.logging.jdk14.Jdk14LoggingImpl debug
> FINE: {pstm-100004} Executing Statement: SELECT * FROM kpis as kpi
> LEFT OUTER JOIN slpis as slpi ON kpi.kpi_id = slpi.kpi_id
> 02-Jun-2008 17:13:34 com.ibatis.common.logging.jdk14.Jdk14LoggingImpl debug
> FINE: {pstm-100004} Parameters: []
> 02-Jun-2008 17:13:34 com.ibatis.common.logging.jdk14.Jdk14LoggingImpl debug
> FINE: {pstm-100004} Types: []
> 02-Jun-2008 17:13:34 com.ibatis.common.logging.jdk14.Jdk14LoggingImpl debug
> FINE: {rset-100005} ResultSet
> 02-Jun-2008 17:13:34 com.ibatis.common.logging.jdk14.Jdk14LoggingImpl debug
> FINE: {rset-100005} Header: [kpi.kpi_id, kpi.title, kpi.description,
> slpi.slpi_id, slpi.title, slpi.description]
> 02-Jun-2008 17:13:34 com.ibatis.common.logging.jdk14.Jdk14LoggingImpl debug
> FINE: {rset-100005} Result: [A, A, KPI A description, A1, A1, SLPI A1
> description]
> etc.
>