一、缓存
缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能。
缓存的介质一般是内存,所以读写速度很快。但如果缓存中存放的数据量非常大时,也会用硬盘作为缓存介质。
Hibernate的缓存包括Session的缓存和SessionFactory的缓存,其中SessionFactory的缓存又可以分为两类:内置缓存和外置缓存。Session的缓存是内置的,不能被卸载,也被称为Hibernate的第一级缓存。SessionFactory的内置缓存和Session的缓存在实现方式上比较相似,前者是SessionFactory对象的一些集合属性包含的数据,后者是指Session的一些集合属性包含的数据。SessionFactory的内置缓存中存放了映射元数据和预定义SQL语句,映射元数据是映射文件中数据的拷贝,而预定义SQL语句是在Hibernate初始化阶段根据映射元数据推导出来,SessionFactory的内置缓存是只读的,应用程序不能修改缓存中的映射元数据和预定义SQL语句,因此SessionFactory不需要进行内置缓存与映射文件的同步。SessionFactory的外置缓存是一个可配置的插件。在默认情况下,SessionFactory不会启用这个插件。外置缓存的数据是数据库数据的拷贝,外置缓存的介质可以是内存或者硬盘。SessionFactory的外置缓存也被称为Hibernate的第二级缓存。
区别:
Hibernate的一级缓存依赖于session的生命周期,无法卸载,只会被单个session所持有,一旦session的生命周期结束,一级缓存也就消失了,因此,一级缓存不会发生并发。
Hibernate的二级缓存是一个可配置的插件,为所有session所共同访问,因此他不适用于高并发的数据。由于二级缓存要保证数据的一致性,即数据源和缓存中数据的一致性,当频繁修改数据时,就需要不断访问数据库以保证一致性。这样缓存变得没有意义了.
二、状态
hibernate的三种状态
1、 瞬时态:刚new 出来的一个对象,只是在内存中占据了一个空间,可被垃圾回收器回收,没有被保存到数据库,也没有与session相关联。
2、 持久态:对象被保存到数据库中,且缓存在session对象中,是一个持久的状态。
3、 脱离态:session关闭了,原来session的缓存脱离了session的控制,但是又有一个数据库的记录与之相对应。但需要重新对这条记录改变时,脱离状态被重新回到持久状态、