一 缓存机制
Hibernate是一个持久层框架,经常访问物理数据库。
为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能。
缓存内的数据是对物理数据源(数据库)中的数据的复制
应用程序在运行时从缓存读写数据,在特定的时刻或事件(更新,修改,删除)会同步缓存和物理数据源的数据。
缓存机制通过减少对数据库的操作(打开,操作,关闭),来提高系统性能
过程原理:
缓存机制会将第一次操作数据库得到的数据,存入缓存中,当再一次去查找时,就会在缓存数据中进行查找,如果有数据则不会去数据库,直接从缓存中获得数据并返回!(不用担心缓存中的数据与数据库中数据不符,hibernate在更新数据库信息时,亦会更新缓存中的数据,保持缓存与数据源中的数据保持一致)
由于缓存中数据量小以及查找速度快,所以会提高性能效率!
(须知:在系统中最耗时的就是数据库的操作-----打开连接,开启事务,执行sql(检索物理内存),提交事务,关闭连接 )
二.抓取策略(n+1次查询)
多方关联查询一方
批量抓取:
在一方的映射文件中添加 在<class>节点中
batch-size=""
一方关联查询多方
批量抓取
不配置fetch="subselect" 否则批量抓取失效
batch-size=""
批量查询可以通过设置batch-size 的值来设置一次查询的数量,从而减少向数据库发起的sql查询的次数(有多少对象发起几次,设置后查询次数 / 设置的值),
一方关联查询多方
fetch="subselect"
一方关联查询多方
fetch="join|select"
多方关联查询一方
fetch="join|select"
3.延时加载
lazy 属性 true false
hibernate默认开启延迟加载(lazy=“true”),
true:
在对实体操作来查询所对应的表的时候,不会主动查询表中的外键所连接的表的信息
即不会主动进行级联查询,只查询该实体类对应的属性!
而后面调用该外键连接的实体信息的时候才去查询该外键连接的表中信息
此机制主要考量对系统性能的提高,避免在不用的时候查询数据库,从而提高性能
false:
与上面相反,不管性能问题,直接在查询时对外键对应的表进行级联查询,取得信息!
4.批量处理
批量处理是解决许多系统性能问题的方案!
一个系统在导入数据时如果数据量很小,则不会突出性能问题
但若是插入数据量过大而未使用批处理,则会严重影响性能
造成的原因主要是:
每次插入一条数据都要打开连接,开启事务,插入,提交事务,关闭连接
将大量的时间和资源耗费在开启连接,关闭连接等操作上
批量处理的解决原理:
就是避免每条插入数据等都要打开连接 等一系列操作,而是将每次每条的sql同步到缓存中(flush),通过一次提交(comit)执行同步进去的多条(可以设置每次提交的数量----批处理数量)sql,来达到对数据的批量增加,从而提高性能
注意:
批处理可以提高性能,但是存在一个性能抛物线,并不是说设置的批处理的值越大,性能越高,而是会在某个值达到最高峰,过大或者过小都会造成性能低下!设置的批处理数量的值需要通过调试来获得