缓存Mapped Statement结果集
通过在查询statement中指定cacheModel属性,可以缓存Mapped Statement中得到的查询结果。Cache model是在SQL Map XML文件中定义的可配置缓存模式,可以使用cacheModel元素来配置。例子如下:
<cacheModel id="product-cache" type ="LRU" readOnly=”true” serialize=”false”>
<flushInterval hours="24"/>
<flushOnExecute statement="insertProduct"/>
<flushOnExecute statement="updateProduct"/>
<flushOnExecute statement="deleteProduct"/>
<property name=”cache-size” value=”1000” />
</cacheModel>
上面的cache model创建了一个名为“product-cache”的缓存,使用“近期最少使用”(LRU)实现。Implemention属性的名称要么是全限定的类名,要么是缓存实现的别名(参见下面的内容)。根据cacheModel中flush元素的内容,上面的例子每24小时刷新一次。一个cacheModel只能有一个flushInteval元素,它可以使用hours,minutes,seconds或milliseconds来设定。另外,当insertProduct,updateProduct或deleteProduct的Mapped Statement执行时,缓存也被刷新。cacheModel可以定义任意多的flushOnExecute元素。某些cache model的实现可能需要另外的属性,如上面的“cache-size”属性。在LRU cache model中,cache-size指定了缓存储存的项数。一旦配置了cache model,您可以指定mapped statement使用的cache model,例如:
<statement id=”getProductList” cacheModel=”product-cache”>
select * from PRODUCT where PRD_CAT_ID = #value#
</statement>
只读 VS 可读写
框架同时支持只读和可读写缓存。只读缓存可供所有用户共享,因此性能更好。但是,只读缓存的数据不应该被修改。相反,要更新数据,必须从数据库(或读写缓存)中读出数据。因此,如果要读出数据并修改,则需要可读写缓存。要使用只读缓存,在cacheModel设置readOnly=“true”。要使用可读写缓存,则设置readOnly=“false”。缺省为只读缓存(true)。
Serializable可读写缓存
正如您所知道的,只对当前Session有效的缓存对整体应用性能的提高作用有限。Serializable可读写缓存可以提高整体应用(而不仅仅是每个Session)的性能。这种缓存为每一个Session返回缓存对象不同的实例(复本)。因此每一个Session都可以安全修改返回的对象。不同之处在于,通常您希望从缓存中得到同一个对象,但这种情况下得到的是不同的对象。还有,每一个缓冲在Serializable缓存的对象都必须是Serializable的。这意味着不能同时使用Serializable缓存和延迟加载,因为延迟加载代理不是Serializable的。想知道如何把Serializable缓存,延迟加载和联合查询结合起来使用,最好的方法是尝试。要使用Serializable缓存,设置readOnly=“false”和serialize=“true”。缺省情况下,缓存是只读模式,不使用Serializable缓存。只读缓存不需要Serializable。
缓存类型Cache Model使用插件方式来支持不同的缓存算法。它的实现在cacheModel的用type属性来指定(如上所示)。指定的实现类必须实现CacheController接口,或是下面4个别名中的其中之一。Cache Model实现的其他配置参数通过cacheModel的property元素来设置。目前包括以下的4个实现:
通过在查询statement中指定cacheModel属性,可以缓存Mapped Statement中得到的查询结果。Cache model是在SQL Map XML文件中定义的可配置缓存模式,可以使用cacheModel元素来配置。例子如下:
<cacheModel id="product-cache" type ="LRU" readOnly=”true” serialize=”false”>
<flushInterval hours="24"/>
<flushOnExecute statement="insertProduct"/>
<flushOnExecute statement="updateProduct"/>
<flushOnExecute statement="deleteProduct"/>
<property name=”cache-size” value=”1000” />
</cacheModel>
上面的cache model创建了一个名为“product-cache”的缓存,使用“近期最少使用”(LRU)实现。Implemention属性的名称要么是全限定的类名,要么是缓存实现的别名(参见下面的内容)。根据cacheModel中flush元素的内容,上面的例子每24小时刷新一次。一个cacheModel只能有一个flushInteval元素,它可以使用hours,minutes,seconds或milliseconds来设定。另外,当insertProduct,updateProduct或deleteProduct的Mapped Statement执行时,缓存也被刷新。cacheModel可以定义任意多的flushOnExecute元素。某些cache model的实现可能需要另外的属性,如上面的“cache-size”属性。在LRU cache model中,cache-size指定了缓存储存的项数。一旦配置了cache model,您可以指定mapped statement使用的cache model,例如:
<statement id=”getProductList” cacheModel=”product-cache”>
select * from PRODUCT where PRD_CAT_ID = #value#
</statement>
只读 VS 可读写
框架同时支持只读和可读写缓存。只读缓存可供所有用户共享,因此性能更好。但是,只读缓存的数据不应该被修改。相反,要更新数据,必须从数据库(或读写缓存)中读出数据。因此,如果要读出数据并修改,则需要可读写缓存。要使用只读缓存,在cacheModel设置readOnly=“true”。要使用可读写缓存,则设置readOnly=“false”。缺省为只读缓存(true)。
Serializable可读写缓存
正如您所知道的,只对当前Session有效的缓存对整体应用性能的提高作用有限。Serializable可读写缓存可以提高整体应用(而不仅仅是每个Session)的性能。这种缓存为每一个Session返回缓存对象不同的实例(复本)。因此每一个Session都可以安全修改返回的对象。不同之处在于,通常您希望从缓存中得到同一个对象,但这种情况下得到的是不同的对象。还有,每一个缓冲在Serializable缓存的对象都必须是Serializable的。这意味着不能同时使用Serializable缓存和延迟加载,因为延迟加载代理不是Serializable的。想知道如何把Serializable缓存,延迟加载和联合查询结合起来使用,最好的方法是尝试。要使用Serializable缓存,设置readOnly=“false”和serialize=“true”。缺省情况下,缓存是只读模式,不使用Serializable缓存。只读缓存不需要Serializable。
缓存类型Cache Model使用插件方式来支持不同的缓存算法。它的实现在cacheModel的用type属性来指定(如上所示)。指定的实现类必须实现CacheController接口,或是下面4个别名中的其中之一。Cache Model实现的其他配置参数通过cacheModel的property元素来设置。目前包括以下的4个实现: