Hibernate的性能优化问题笔记
性能优化
1.注意session.clear()的运用。尤其是不断分页循环的情况下。
a)在一个大集合中进行遍历,遍历取出数据或者对象
b)java会引起内存泄漏吗?在语法上是不可能出现内存泄露的,因为我们是运行在java虚拟机,有垃圾处理机制。但是在实际操作中,比如打开session不关闭,打开sessionfactory不关闭(数据库连接池),打开本地文件不关闭等等,这些都是占用内存的,所以可能操作不当会引起内存泄漏。
2.1+N问题(一对多,多对一)把关联对象也取出来了实际并不需要。导致冗余。
a)将fecthType设置为lazy(按需而发Query)
b)BatchSize(size=5) 一次性发5条语句 只是少发sql语句了
c)join fetch
3.list和iterate不同
a)list是直接把对象取出来。iterate是先取出主键id,有需要的时候,在根据id取对象。
b)list不会应用session缓存 第一次取出时放入缓存,当发送相同的查询语句时,会再次刷新缓存。再次发送sql(仍然会到数据库查询).而iterate是先去找session级缓存,如果有。不会再发sql语句了。所以我们可以取数据是用list,而查时用iterate.
4.一级缓存 二级缓存 查询缓存
一级缓存是指session缓存,在同一个session中共享。
二级缓存是sessionfactory缓存,可跨越session。(ehcache,oscache,(硬盘和内存)jbosscache,sawrmcache(红色可用于集群环境))
二级环境适用环境:1,经常被访问2.改动不大3.数据量小
<property name="cache.use_second_level_cache">true</property> <property name="cache.provider_class">org.hibernate.cache.EhsCacheProvider</property>
加@cache注解。
如果适用查询缓存要配置
<property name="cache.use_second_level_cache">true</property> <property name="cache.provider_class">org.hibernate.cache.EhsCacheProvider</property> <property name="cache.use_query_cache">true</property>
代码要加 iscacheable(true).
5.缓存算法LRU(空闲时间长拿走) LFU(命中率低的拿走) FIFO(先进先出)