我注意到我网站上的速度变慢了,打开debug 'org.hibernate.SQL'
后,我发现问题出在哪里。我已经设置了一个使用....来缓存的域类。
class Foo{
...
static mapping ={
cache 'read-only'
}
String name //<-- simple data type, no associations
String description //<-- simple data type, no associations
}
我的hibernate配置看起来像这样......
hibernate {
cache.use_second_level_cache=true
cache.use_query_cache=true
cache.provider_class='net.sf.ehcache.hibernate.EhCacheProvider'
}
我的查询看起来像这样(在网络流程中)......
def wizardFlow = {
...
def flow.foos = Foo.list([sort:"name", order:"asc", cache:true])
// def flow.foos = Foo.findAll([cache:true]) <--- same result, no caching
}
我认为查询缓存或二级缓存会阻止数据库被命中,但我的日志已加载...
select ... from thing thing0_ where thing0_.id=?
select ... from thing thing0_ where thing0_.id=?
select ... from thing thing0_ where thing0_.id=?
select ... from thing thing0_ where thing0_.id=?
任何人都可以了解可能发生的事情吗?其他查询正在按预期行事!
我正在使用Grails 1.3.7
最后,这是我的ehcache.xml ...
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ehcache.xsd" >
<diskStore path="java.io.tmpdir"/>
<cacheManagerEventListenerFactory class="" properties=""/>
<defaultCache
maxElementsInMemory="1000000"
eternal="false"
timeToIdleSeconds="3600"
timeToLiveSeconds="7200"
overflowToDisk="true"
diskPersistent="false"
/>
<cache name="org.hibernate.cache.UpdateTimestampsCache"
maxElementsInMemory="10000"
timeToIdleSeconds="300"
/>
<cache name="org.hibernate.cache.StandardQueryCache"
maxElementsInMemory="10000"
timeToIdleSeconds="300"
/>
</ehcache>
答案 0 :(得分:0)
看起来我们遇到的问题基本上是N + 1选择问题。这就是我们所做的:
import org.hibernate.FetchMode as FM
...
def crit= item.createCriteria();
def itemList = crit.listDistinct
{
fetchMode "subItem", FM.JOIN
cache true
order("name","asc")
}
您应该能够将subItem切换到您关联的内容,这应该有所帮助。