大多数静态的,频繁访问的域类(如国家/地区和货币)可以从缓存中受益匪浅。
class country {
:
static mapping = {
cache usage: 'read-only', include: 'non-lazy'
}
}
但是,偶尔会添加一个新国家/地区或在多服务器环境中修改现有国家/地区。我们正在寻找的解决方案是缓存超时,以便在每个域类的可配置时间之后,例如, 10分钟,它在请求获取时重新读取数据。
目前,唯一的选择是如果您缓存某些内容,则必须重新启动所有服务器。我们不希望广播变化的分布式缓存的复杂性,只是基于每个域的缓存老化选项。
这是否可以使用grails 2.4.4,还是我们需要实现自己的缓存层?使用MyBatis指定最大年龄(也就是缓存超时)很容易 - 希望grails有一个未记录的功能。
答案 0 :(得分:1)
重新启动服务器远非唯一的选择。
mapping
块中缓存的配置选项非常有限,但这至少部分是因为没有标准配置API,因此您需要根据提供商的不同而不同。
默认实现是Ehcache,配置非常简单。如果Ehcache在类路径的根目录中找到ehcache.xml
文件,它将使用该文件而不是默认值。 src/java
中的非Java文件和grails-app/conf
中的非Java /非Groovy文件在编译期间被复制到类路径中的目录,因此将文件放在那里是使其可访问的最佳选择
使用this heavily commented example ehcache.xml file开始使用。
如果你想删除一个或多个缓存的实例,Hibernate有一个API。您可以在sessionFactory
bean上调用几种“逐出”方法,例如sessionFactory.evict(Book)
删除所有缓存的Book
个实例,sessionFactory.evict(Book, 5)
删除ID为5的缓存Book
等。
来自this SpringOne/2GX talk的幻灯片中有很多相关信息,包括配置Ehcache和使用二级缓存API。