iBATIS 缓存不会在给定语句上刷新

发布于 2024-07-15 11:40:46 字数 1828 浏览 8 评论 0原文

我正在使用 iBatis 进行数据库交互。 最近我试图通过配置缓存来提高一些静态数据获取的性能。 缓存已配置并正常工作,但问题在于每当该数据发生任何插入/更新/删除时都会刷新缓存数据。 我对类别表做了以下配置,

<cacheModel  type="LRU" id="categoryCache"  readOnly="true" serialize="false">
    <flushOnExecute statement="insertCategory"/>
    <flushOnExecute statement="updateCategory"/>
    <flushOnExecute statement="deleteCategory"/>
    <property name="size" value="1000"/>
</cacheModel>

<insert id="insertCategory"
    parameterClass="com.uniplas.entity.master.beans.CategoryVO">
    insert into categories (code, description)
    values(#code:VARCHAR#,#description:VARCHAR#)
</insert>

<update id="updateCategory"
    parameterClass="com.uniplas.entity.master.beans.CategoryVO">
    update categories set description=#description:VARCHAR# where code=#code:VARCHAR#
</update>

<delete id="deleteCategory"
    parameterClass="com.uniplas.entity.master.beans.CategoryVO">
    delete from categories where code=#code:VARCHAR#
</delete>

<select id="selectCategory" resultMap="categoryResult"
    parameterClass="java.util.Map" cacheModel="categoryCache">
    select * from categories where 1=1
    <dynamic>
        <isNotEmpty property="categoryVO.code">
            and code like #categoryVO.code:VARCHAR#
        </isNotEmpty>
        <isNotEmpty property="categoryVO.description">
            and description like
            #categoryVO.description:VARCHAR#
        </isNotEmpty>
        <isNotEmpty property="orderBy">
            order by $orderBy$
        </isNotEmpty>

    </dynamic>
</select>

现在的问题是,即使执行 insertCategory / updateCategory / deleteCategory 语句中的任何一个,缓存也不会被刷新。 它维护插入/更新/删除之前选择的任何数据!

请让我知道我哪里出错了。

I am using iBatis for my database interaction. Lately I am trying to improve performance of some static data fetches by configuring caching. The chache got configured and worked properly however the problem is in flushing of cache data whenever any insert/update/delete happens to that data. I did following configuration for category table,

<cacheModel  type="LRU" id="categoryCache"  readOnly="true" serialize="false">
    <flushOnExecute statement="insertCategory"/>
    <flushOnExecute statement="updateCategory"/>
    <flushOnExecute statement="deleteCategory"/>
    <property name="size" value="1000"/>
</cacheModel>

<insert id="insertCategory"
    parameterClass="com.uniplas.entity.master.beans.CategoryVO">
    insert into categories (code, description)
    values(#code:VARCHAR#,#description:VARCHAR#)
</insert>

<update id="updateCategory"
    parameterClass="com.uniplas.entity.master.beans.CategoryVO">
    update categories set description=#description:VARCHAR# where code=#code:VARCHAR#
</update>

<delete id="deleteCategory"
    parameterClass="com.uniplas.entity.master.beans.CategoryVO">
    delete from categories where code=#code:VARCHAR#
</delete>

<select id="selectCategory" resultMap="categoryResult"
    parameterClass="java.util.Map" cacheModel="categoryCache">
    select * from categories where 1=1
    <dynamic>
        <isNotEmpty property="categoryVO.code">
            and code like #categoryVO.code:VARCHAR#
        </isNotEmpty>
        <isNotEmpty property="categoryVO.description">
            and description like
            #categoryVO.description:VARCHAR#
        </isNotEmpty>
        <isNotEmpty property="orderBy">
            order by $orderBy$
        </isNotEmpty>

    </dynamic>
</select>

Now the problem is that even if any of insertCategory / updateCategory / deleteCategory statement is executed, the cache does not get flushed. It maintains the data whatver was selected prior to insert / update / delete !

Please let me know where I am going wrong.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

静谧 2024-07-22 11:40:46

尝试将缓存设置为 readOnly="false" ——来自文档:

框架同时支持只读
和读/写缓存。 只读
缓存在所有用户之间共享
因此提供更好的性能
益处。 然而,对象读取自
只读缓存不应该
修改的。 相反,一个新对象应该
从数据库中读取(或
读/写缓存)用于更新。 上
另一方面,如果有意图
使用对象进行检索和
修改,读/写缓存是
推荐(即必需)。 要使用
只读缓存,设置readOnly=”true”
在缓存模型元素上。 要使用
读/写缓存,设置
只读=“假”。 默认为
只读(真)。

Try setting your cache to readOnly="false" -- From the documentation:

The framework supports both read-only
and read/write caches. Read-only
caches are shared among all users and
therefore offer greater performance
benefit. However, objects read from a
read-only cache should not be
modified. Instead, a new object should
be read from the database (or a
read/write cache) for updating. On the
other hand, if there is an intention
to use objects for retrieval and
modification, a read/write cache is
recommended (i.e. required). To use a
read-only cache, set readOnly=”true”
on the cache model element. To use a
read/write cache, set
readOnly=”false”. The default is
read-only (true).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文