在Hibernate中启用实体和查询缓存
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
在Hibernate中启用实体和查询缓存相关推荐
- hibernate查询缓存_在Hibernate中启用实体和查询缓存
hibernate查询缓存 1.简介 在我执行过的与性能相关的任务中,这就是其中之一. 令人担心的是,如果对于特定实体每次都调用相同的查询,并且表数据在特定的时隙内不易更改,则我们可以使用Hibern ...
- sql查询禁用缓存_如何在SQL Server 2017中启用和禁用身份缓存
sql查询禁用缓存 Every data warehouse developer is likely to appreciate the significance of having surrogat ...
- 浅谈Hibernate中的几个查询
浅谈Hibernate中的几个查询 一.load和get方法的区别 1.load在查询时,先从一级缓存中寻找与数据索引对应的实体对象,然后构建并返回一个代理对象,当我们真正使用这个代理对象的时候,这时 ...
- Hibernate中的命名SQL查询
2019独角兽企业重金招聘Python工程师标准>>> 1. 命名查询指的是用<sql-query>标签在影射文档中定义的SQL查询,可以通过使用Session.get ...
- Hibernate中createCriteria即QBC查询的详细用法 .Hibernate中createCriteria即QBC查询的详细用法 ....
现在假设有一个Student类,内有id,name,age属性 String hql = "from Student s"; 按照以前的做法,我们通常是 Query query = ...
- Hibernate中hql的基本查询、条件查询、排序插叙、分页查询、投影查询
hql语句和sql语句不同,当我们使用hql语句查询时,要把SQL语句的表写成 实体类的类名,字段写成实体类的属性 基本查询:查出数据库中所有的数据 代码如下: //基本查询,查询所有的实体@Test ...
- Hibernate中的实体映射
一.一对一映射 如人(Person)与身份证(IdCard) 的关系,即为一对一的关系,一个人只能有一张身份证,一张身份证只能属于某一个人,它们的关系图如下图所示: 在Person实体中添加一个属性 ...
- 在Hibernate中Query的uniqueResult查询。
转自品略图书馆:http://www.pinlue.com/article/2020/03/0920/1310003985022.html 以前写代码,总免不了编写登陆部分.在获取user的时候,只可 ...
- Hibernate中启用日志
Problem How do you determine what SQL query is being executed by Hibernate? How can you see the Hibe ...
最新文章
- 分析部署无线局域网的关键要素
- 填报表中也可以添加 html 事件
- 【前沿科技】云计算军事运用有啥特点
- 【洛谷】【动态规划/二维背包】P1855 榨取kkksc03
- 确定多重选择列表控件 (List Control) 中的选定内容
- PAT、PMT、SDT详解
- 使用opencv简单的播放AVI程序(40行)
- 装机之windows10和ubuntu双系统
- JAVA微服务框架,Jeecg-P3 1.0.0 重构版本发布
- 金融诈骗中男性更易受骗:损失数额更大
- 再谈贝叶斯学派与频率学派的区别
- 寒冰作品——零起点学习Linux系列培训视频
- 【浅谈】样本方差的分母“n”为什么要改为“n-1”
- X264实现H264编码以及MediaMuxer的另类用法「第八章,Android音视频编码那点破事」
- 解决linux:docker-compose: Permission denied
- 使用PIL包给图片增加水印
- 一个http请求的全过程是怎样的?
- ps中用钢笔进行抠图
- Python批量修改文件夹及其子文件夹下的文件内容
- php执行dmidecode,Linux dmidecode 命令