hibernate中的缓存以及性能分析
2009-02-19 01:49
253 查看
Hibernate 中实现了良好的Cache 机制,我们可以借助Hibernate 内部的Cache迅速提高系统数据读取性能。
需要注意的是:Hibernate做为一个应用级的数据访问层封装,只能在其作用范围内保持Cache中数据的的有效性,也就是说,在我们的系统与 第三方系统共享数据库的情况下,Hibernate的Cache机制可能失效。一个很简单的例子,如果你用access修改了库中的值,那么这就不会更新 JVM中的缓冲池,这就导致了赃数据的产生。
Hibernate 在本地JVM 中维护了一个缓冲池,并将从数据库获得的数据保存到池中以供下次重复使用(如果在Hibernate中数据发生了变动,Hibernate同样也会更新池 中的数据版本)。此时,如果有第三方系统对数据库进行了更改,那么,Hibernate并不知道数据库中的数据已经发生了变化,也就是说,池中的数据还是 修改之前的版本,下次读取时,Hibernate会将此数据返回给上层代码,从而导致潜在的问题。外部系统的定义,并非限于本系统之外的第三方系统,即使 在本系统中,如果出现了绕过Hibernate数据存储机制的其他数据存取手段,那么Cache的有效性也必须细加考量。如,在同一套系统中,基于 Hibernate和基于JDBC的两种数据访问方式并存,那么通过JDBC更新数据库的时候,Hibernate同样无法获知数据更新的情况,从而导致 脏数据的出现。
基于Java 的Cache 实现,最简单的莫过于HashTable,hibernate 提供了基于Hashtable 的Cache 实现机制,不过,由于其性能和功能上的局限,仅供开发调试中使用。同时,Hibernate 还提供了面向第三方Cache 实现的接口,如JCS、EHCache、OSCache、JBoss Cache、SwarmCache等。
Hibernate中的Cache大致分为两层,第一层Cache在Session实现,属于事务级数据缓冲,一旦事务结束,这个Cache 也就失效。此层Cache 为内置实现,无需我们进行干涉。第二层Cache,是Hibernate 中对其实例范围内的数据进行缓存的管理容器。
12.5.1 二级缓存
Hibernate早期版本中采用了JCS(Java Caching System -Apache Turbine项目中的一个子项目)作为默认的第二层Cache实现。由于JCS的发展停顿,以及其内在的一些问题(在某些情况下,可能导致内存泄漏以及 死锁),新版本的Hibernate已经将JCS去除,并用EHCache作为其默认的第二级Cache实现。相对JCS,EHCache更加稳定,并具 备更好的缓存调度性能,缺陷是目前还无法做到分布式缓存,如果我们的系统需要在多台设备上部署,并共享同一个数据库,必须使用支持分布式缓存的Cache 实现(如JCS、JBossCache)以避免出现不同系统实例之间缓存不一致而导致脏数据的情况。Hibernate对Cache进行了良好封装,透明 化的Cache机制使得我们在上层结构的实现中无需面对繁琐的Cache维护细节。
Hibernate的Session在事务级别进行持久化数据的缓存操作。 当然,也有可能分别为每个类(或集合),配置集群、或JVM级别(SessionFactory级别)的缓存。 你甚至可以为之插入一个集群的缓存。注意,缓存永远不知道其他应用程序对持久化仓库(数据库)可能进行的修改 (即使可以将缓存数据设定为定期失效)。
通过在hibernate.cache.provider_class属性中指定org.hibernate.cache.CacheProvider的某个实现的类名,你可以选择让Hibernate使用哪个缓存实现。Hibernate打包一些开源缓存实现,提供对它们的内置支持(见下表)。除此之外,你也可以实现你自己的实现,将它们插入到系统中。注意,在3.2版本之前,默认使用EhCache 作为缓存实现,但从3.2起就不再这样了。
需要注意的是:Hibernate做为一个应用级的数据访问层封装,只能在其作用范围内保持Cache中数据的的有效性,也就是说,在我们的系统与 第三方系统共享数据库的情况下,Hibernate的Cache机制可能失效。一个很简单的例子,如果你用access修改了库中的值,那么这就不会更新 JVM中的缓冲池,这就导致了赃数据的产生。
Hibernate 在本地JVM 中维护了一个缓冲池,并将从数据库获得的数据保存到池中以供下次重复使用(如果在Hibernate中数据发生了变动,Hibernate同样也会更新池 中的数据版本)。此时,如果有第三方系统对数据库进行了更改,那么,Hibernate并不知道数据库中的数据已经发生了变化,也就是说,池中的数据还是 修改之前的版本,下次读取时,Hibernate会将此数据返回给上层代码,从而导致潜在的问题。外部系统的定义,并非限于本系统之外的第三方系统,即使 在本系统中,如果出现了绕过Hibernate数据存储机制的其他数据存取手段,那么Cache的有效性也必须细加考量。如,在同一套系统中,基于 Hibernate和基于JDBC的两种数据访问方式并存,那么通过JDBC更新数据库的时候,Hibernate同样无法获知数据更新的情况,从而导致 脏数据的出现。
基于Java 的Cache 实现,最简单的莫过于HashTable,hibernate 提供了基于Hashtable 的Cache 实现机制,不过,由于其性能和功能上的局限,仅供开发调试中使用。同时,Hibernate 还提供了面向第三方Cache 实现的接口,如JCS、EHCache、OSCache、JBoss Cache、SwarmCache等。
Hibernate中的Cache大致分为两层,第一层Cache在Session实现,属于事务级数据缓冲,一旦事务结束,这个Cache 也就失效。此层Cache 为内置实现,无需我们进行干涉。第二层Cache,是Hibernate 中对其实例范围内的数据进行缓存的管理容器。
12.5.1 二级缓存
Hibernate早期版本中采用了JCS(Java Caching System -Apache Turbine项目中的一个子项目)作为默认的第二层Cache实现。由于JCS的发展停顿,以及其内在的一些问题(在某些情况下,可能导致内存泄漏以及 死锁),新版本的Hibernate已经将JCS去除,并用EHCache作为其默认的第二级Cache实现。相对JCS,EHCache更加稳定,并具 备更好的缓存调度性能,缺陷是目前还无法做到分布式缓存,如果我们的系统需要在多台设备上部署,并共享同一个数据库,必须使用支持分布式缓存的Cache 实现(如JCS、JBossCache)以避免出现不同系统实例之间缓存不一致而导致脏数据的情况。Hibernate对Cache进行了良好封装,透明 化的Cache机制使得我们在上层结构的实现中无需面对繁琐的Cache维护细节。
Hibernate的Session在事务级别进行持久化数据的缓存操作。 当然,也有可能分别为每个类(或集合),配置集群、或JVM级别(SessionFactory级别)的缓存。 你甚至可以为之插入一个集群的缓存。注意,缓存永远不知道其他应用程序对持久化仓库(数据库)可能进行的修改 (即使可以将缓存数据设定为定期失效)。
通过在hibernate.cache.provider_class属性中指定org.hibernate.cache.CacheProvider的某个实现的类名,你可以选择让Hibernate使用哪个缓存实现。Hibernate打包一些开源缓存实现,提供对它们的内置支持(见下表)。除此之外,你也可以实现你自己的实现,将它们插入到系统中。注意,在3.2版本之前,默认使用EhCache 作为缓存实现,但从3.2起就不再这样了。
相关文章推荐
- Hibernate中的缓存以及性能分析
- Hibernate中的缓存以及性能分析
- hibernate annotations OneToMany与ManyToOne 分析 以及延迟加载性能分析
- Memcache的核心性能分析以及APC缓存系统选择
- Hibernate的性能分析--懒加载、抓取策略、缓存策略
- hibernate annotations OneToMany与ManyToOne 分析 以及延迟加载性能分析
- Hibernate高级特性以及性能优化
- hibernate中PO对象的三种状态分析以及session中的一些方法的区别
- hibernate和mybatis的对比分析以及技术选型
- MySql性能加速分析以及PHPMYADMIN中explain用法
- JS几种数组遍历方式以及性能分析对比
- memcached 压力测试以及性能分析
- JS几种变量交换方式以及性能分析对比
- asp.ent(C#)中判断空字符串的3种方法以及性能分析
- 关于hibernate一级,二级缓存以及事务隔离机制。
- 【Java基础】Hibernate的缓存机制以及延迟加载
- JAVAWEB开发之Hibernate详解(三)——Hibernate的检索方式、抓取策略以及利用二级缓存进行优化、解决数据库事务并发问题
- ASP.NET性能优化之局部缓存分析
- paip.cache 缓存架构以及性能提升总结
- 关于hibernate一级,二级缓存以及事务隔离机制。