您的位置:首页 > 其它

Hibernate知识点汇总

2015-09-01 20:51 316 查看
Hibernate主键生成策略:

1. assigned - 新增数据时由应用程序指定主键的值

2. increment - 新增数据时先查询主键列最大值,加1作为新主键

3. identity - SQL Server自增列

4. native - 针对不同数据库采用不同的主键生成策略. SQL Server用identity, Oracle则用sequence,区分数据库以Hibernate配置文件里的dialect.

5. uuid - 32位随机码

<id name="实体类属性名" type="java.lang.Integer"> 

      <column name="对应表中主键字段名" /> 

      <generator class="assiged|increment|identity|native|........" /> 

</id> 

---------------------------------------------------------------------------------------------------------------------------

清理缓存:

1. Transaction.commit();

2. 查询操作

3. Session.flush();

                                                       查询操作                        commit()                      flush()

--------------------------------------------------------------------------------------------

FlushMode.AUTO                       Y                                          Y                                       Y

FlushMode.COMMIT                 N                                         Y                                        Y

FlushMode.NEVER                    N                                         N                                       Y

-----------------------------------------------------------------------------------------------------------------------------

Java对象状态:

transient      new Object();

persistent    transient->save(); detached->update()

removed       delete();

detached      session.close();  evict();

=================================================================================

同步:   save(),update(), saveOrUpdate(), delete() -> flush() -> refresh() - If trigger exists

=================================================================================

CacheConcurrencyStrategy.READ_ONLY  只读模式,在此模式下,如果对数据进行更新操作,会有异常;

CacheConcurrencyStrategy.READ_WRITE  读写模式在更新缓存的时候会把缓存里面的数据换成一个锁,其它事务如果去取相应的缓存数据,发现被锁了,直接就去数据库查询;

CacheConcurrencyStrategy.NONSTRICT_READ_WRITE  不严格的读写模式则不会的缓存数据加锁;

CacheConcurrencyStrategy.TRANSACTIONAL   事务模式指缓存支持事务,当事务回滚时,缓存也能回滚,只支持 JTA环境。

EHCache: 可作为进程范围内的缓存,对查询缓存提供了支持(1.7以上支持集群)

JbossCache: 可作为集群范围内的缓存,支持事务型并发访问策略,对Hibernate查询缓存提供了支持

=================================================================================

Session与二级缓存交互模式:

CacheMode.NORMAL: 正常模式(默认), Session会从二级缓存里读取也会写入

CacheMode.IGNORE:  忽略二级缓存,不读不写

CacheMode.GET: 读取模式,Session会读二级缓存,但不会写

CacheMode.PUT:  写入模式,Session不会读二级缓存,但是会写从数据库读到的数据

CacheMode.REFRESH: 刷新模式,Session不读二级缓存,但是会强制刷新二级缓存中的数据

=================================================================================

ehcache.xml

<cache name="org.hibernate.cache.StandardQueryCache"

        maxElementsInMemory="10000"  -缓存中存放对象的最大数目

        eternal="false"                                          -true永不过期

        timeToIdleSeconds="18000"            -自最后一次访问空闲时间,超时则过期

        timeToLiveSeconds="0"                      -最长过期时间,0为无期限, 这一参数应该大于等于timeToIdleSeconds才有意义

        overflowToDisk="true"/>                   - 内存中超过对象最大数目,则缓存在硬盘上

=================================================================================

hibernate的查询缓存

查询缓存的实现机制与二级缓存基本一致,最大的差异在于放入缓存中的key是查询的语句,value是查询之后得到的结果集的id列表。

表面看来这样的方案似乎能解决hql利用缓存的问题,但是需要注意的是,构成key的是:hql生成的sql、sql的参数、排序、分页信息等。

也就是说如果你的hql有小小的差异,比如第一条hql取1-50条数据,第二条hql取20-60条数据,那么hibernate会认为这是两个完全不同的key,

无法重复利用缓存。因此利用率也不高。

另外一个需要注意的问题是,查询缓存和二级缓存是有关联关系的,他们不是完全独立的两套东西。假如一个查询条件hql_1,第一次被执行的时候,

它会从数据库取得数据,然后把查询条件作为key,把返回数据的所有id列表作为value(请注意仅仅是id)放到查询缓存中,同时整个结果集放到

class缓存(也就是二级缓存),key是id,value是pojo对象。当你再次执行hql_1,它会从缓存中得到id列表,然后根据这些列表一个一个的到class缓存

里面去找pojo对象,如果找不到就向数据库发起查询。也就是说,如果二级缓存配置了超时时间(或者发呆时间),就有可能出现查询缓存命中了,

获得了id列表,但是class里面相应的pojo已经因为超时(或发呆)被失效,hibernate就会根据id清单,一个一个的去向数据库查询,有多少个id,就执行多少个sql。

该情况将导致性能下降严重。

查询缓存的失效机制也由hibernate控制,数据进入缓存时会有一个timestamp,它和数据表的timestamp对应。当hibernate环境内发生save、update等操作时,

会更新被操作数据表的timestamp。用户在获取缓存的时候,一旦命中就会检查它的timestamp是否和数据表的timestamp匹配,如果不,缓存会被失效。

因此查询缓存的失效控制是以数据表为粒度的,只要数据表中任何一条记录发生一点修改,整个表相关的所有查询缓存就都无效了。因此查询缓存的命中率可能会很低。

结论:不应把hibernate二级缓存作为优化的主要手段,一般情况下建议不要使用。

==========================================================================================================================
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: