1.简介
在我执行过的与性能相关的任务中,这就是其中之一。 令人担心的是,如果每次为特定实体调用相同的查询,并且表数据在特定的时隙内不易更改,则我们可以使用Hibernate缓存查询结果。 这意味着,如果我们需要ID为1234的Student的详细信息,则查询将仅针对第一个请求执行并访问数据库。 后续请求与查询缓存中的结果一起提供。 这对我们注意到的响应时间产生了很大的影响。 在执行此操作时,我们还担心缓存何时刷新。 我们将通过一个简单的配置轻松地做到这一点,我们将对此进行探讨。
如果应用查询缓存,则不会将任何后续SQL语句发送到数据库。 从查询缓存中检索查询结果,然后使用缓存的实体标识符访问第二级缓存。
2.实施
要启用查询缓存,下面是需要遵循的步骤集–
- 将hibernate.cache.use_query_cache属性设置为true ,并确保启用了第二级缓存 。 单击此链接以了解二级缓存。
<bean id="sessionFactory"class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"><property name="dataSource" ref="dataSource" /><property name="hibernateProperties"><props><prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop><prop key="hibernate.show_sql">true</prop><!-- Enable second level cache --><prop key="hibernate.cache.use_second_level_cache">true</prop><prop key="hibernate.cache.use_query_cache">true</prop><prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop><prop key="net.sf.ehcache.configurationResourceName">/ehCache.xml</prop></props></property><property name="mappingResources"><list><value>User.hbm.xml</value></list></property> </bean>
- 完成后, org.hibernate.cache.internal.StandardQueryCache保存缓存的查询结果。
- 在ehCache配置文件中,添加以下代码段–
<cache name="org.hibernate.cache.StandardQueryCache" maxElementsInMemory="10000" eternal="false" timeToLiveSeconds="86400" overflowToDisk="false" memoryStoreEvictionPolicy="LRU" />
- 查询缓存不会在缓存中缓存实际实体的状态。 它缓存标识符值和值类型的结果。 因此, 对于那些应作为查询结果缓存的一部分缓存的实体 ,请始终将查询缓存与第二级缓存结合使用 – https://docs.jboss.org/hibernate/orm/4.0/devguide/zh- US / html / ch06.html
- 要按照第4点的指示缓存相关实体,我们需要将以下代码段添加到XML实体映射文件中,如下所示:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping><class name="Employee" table="EMPLOYEE"><cache usage="transactional" include="non-lazy" /><id name="id" type="int" column="ID"><generator class="native"/></id><property name="firstName" column="FNAME" type="string"/><property name="lastName" column="LNAME" type="string"/></class> </hibernate-mapping>
上面的内容确保实体的非惰性组件作为查询结果缓存的一部分被缓存。
- 涵盖了以上所有要点之后,最后一点是显式启用对单个查询的查询缓存,如下所示:
Query query = session.createQuery("FROM EMPLOYEE"); query.setCacheable(true); List users = query.list();
完成所有这些操作之后,也许您可以在调试模式下启动服务器,然后看看魔术发生了!
翻译自: https://www.javacodegeeks.com/2016/04/enabling-entity-query-cache-hibernate.html