hibernate缓存(cache)-一些心得

本文介绍了Hibernate二级缓存的配置及使用方法,并对比了list与iterator两种查询方式的特点,指导如何选择适当的查询方法以提高应用性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  什么是缓存,为什么使用缓存的这些问题我就不再阐述了。

 

  直接进入正题,hibernate分为一级缓存和二级缓存,这里主要说的是二级缓存。

 

  从配置开始 src 下创建文件名为:ehcache.xml

 

<ehcache>



    <diskStore path="java.io.tmpdir"/>





    <defaultCache

        maxElementsInMemory="10000"

        eternal="false"

        overflowToDisk="true"

        timeToIdleSeconds="7200"

        timeToLiveSeconds="3600"

        diskPersistent="false"

        diskExpiryThreadIntervalSeconds="120"

        />


        

</ehcache>
 

hibernate.cfg.xml加上

 

<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>

 

<property name="hibernate.cache.use_query_cache">true</property>

 

在hibernate查询代码里加上query.setCacheable(true);

 

这时已经开启了二级缓存,具体细节不做具体描述,因为我写这个东西的本意是想记录下如果合理使用二级缓存。

 

  当然我们知道hibernate里有两种方法获取一个列表数据分别为.iterator()和.list(),那么什么时候使用iterator什么时候使用list呢?

 

  场景一:

 

  获得数据库论坛板块信息,我们知道,数据库论坛板块的信息,基本上半年一年才变动一次,而且每次发送到数据库的sql语句,和返

 

回来的数据基本上都是一模一样的(也就是数据信息和sql语句(搜索条件)很少会修改的),那么这个时候我们应该考虑使用list方法来返回

 

信息,因为list方法第一次执行的时候会把数据库的数据信息都存放到二级缓存中,同时会记录你发送的sql语句,如果下次你还是利用

 

list方法发送一模一样的sql语句,同时数据也没有在被hibernate知道的情况下修改过,那么第二次甚至第n次再执行这个语句的时

 

候,hibernate是不用连接数据库的,而是直接把缓存里的数据返回给你。

 

  场景二:

 

  获得论坛某个板块的最新的20条信息,我们知道,论坛的第一页总是显示新发布或则有新回复的帖子,那么我们这个时候能使用list

 

方法来获取信息吗?答案是否定的。它虽然满足了list的条件之一(搜索条件很少会修改的),但是未满足另外一个条件,因为它数据信

 

息的修改是很频繁的(有新帖,或新回复的帖),那么这个时候我们就得考虑使用iterator来获取数据信息,iterator的原理是这样的,首先

 

先发送一条语句(iterator时query的sql:select * from table where id>n 真正发送:select id from table where id>n)获得所有符

 

合条件的ID,然后到二级缓存里边去找这个对象,如果发现,则获取它,如果没发现,则发送一条语句获得该ID的对象(n+1问题),比

 

方说,我们要获得最新20条信息(之前已经查询过一次,但现在有一个新帖),使用iterator方法会先发送一条语句获得满足SQL语句条

 

件的所有的ID,然后因为之前已经查询过一次,所以缓存里边已经有其中的19个帖子的缓存(因为有一个是新帖还没被hibernate查询

 

过,所以缓存里边还没有),然后再发送一条条件为ID=新帖ID的SQL语句来获得这个新帖的对象。

 

总结:

当hibernate二级缓存开启时,只要是经由hibernate的session对象来获得的任何对象hibernate都会把它放到缓存里

 

边,当该对象被修改或删除时,hibernate会把该对象在二级缓存中也删除掉。list方法一次获得所有数据同时放到缓存

 

中,如果SQL语句不变同时数据也没被改变的情况下,list直接取的缓存而不用再连接数据库进行检索操作,iterator方法用

 

n+1此来获得所有数据信息同时放到缓存中,不管SQL语句变没变始终会发送一条获得ID的SQL语句,然后根据ID查找缓

 

存,如果没有则再发送一条SQL语句获得该对象,虽然iterator始终会发送一条或(n+1)条,但发送的语句都是根据ID来获

 

取的,所以速度也是非常可观的(相对没有任何缓存机制而言)。

 

如果某个地方还没理解,或是我理解有误的地方还请指出,感谢。

 

 

CH341A编程器是一款广泛应用的通用编程设备,尤其在电子工程和嵌入式系统开发领域中,它被用来烧录各种类型的微控制器、存储器和其他IC芯片。这款编程器的最新版本为1.3,它的一个显著特点是增加了对25Q256等32M芯片的支持。 25Q256是一种串行EEPROM(电可擦可编程只读存储器)芯片,通常用于存储程序代码、配置数据或其他非易失性信息。32M在这里指的是存储容量,即该芯片可以存储32兆位(Mbit)的数据,换算成字节数就是4MB。这种大容量的存储器在许多嵌入式系统中都有应用,例如汽车电子、工业控制、消费电子设备等。 CH341A编程器的1.3版更新,意味着它可以与更多的芯片型号兼容,特别是针对32M容量的芯片进行了优化,提高了编程效率和稳定性。26系列芯片通常指的是Microchip公司的25系列SPI(串行外围接口)EEPROM产品线,这些芯片广泛应用于各种需要小体积、低功耗和非易失性存储的应用场景。 全功能版的CH341A编程器不仅支持25Q256,还支持其他大容量芯片,这意味着它具有广泛的兼容性,能够满足不同项目的需求。这包括但不限于微控制器、EPROM、EEPROM、闪存、逻辑门电路等多种类型芯片的编程。 使用CH341A编程器进行编程操作时,首先需要将设备通过USB连接到计算机,然后安装相应的驱动程序和编程软件。在本例中,压缩包中的"CH341A_1.30"很可能是编程软件的安装程序。安装后,用户可以通过软件界面选择需要编程的芯片类型,加载待烧录的固件或数据,然后执行编程操作。编程过程中需要注意的是,确保正确设置芯片的电压、时钟频率等参数,以防止损坏芯片。 CH341A编程器1.3版是面向电子爱好者和专业工程师的一款实用工具,其强大的兼容性和易用性使其在众多编程器中脱颖而出。对于需要处理25Q256等32M芯片的项目,或者26系列芯片的编程工作,CH341A编程器是理想的选择。通过持续的软件更新和升级,它保持了与现代电子技术同步,确保用户能方便地对各种芯片进行编程和调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值