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(先进先出

原文地址:https://www.cnblogs.com/wenjieyatou/p/6130358.html