`
Josh_Persistence
  • 浏览: 1649944 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类

Hibernate中的缓存

阅读更多

Hibernate中的缓存

 

一、Hiberante中常见的三大缓存:一级缓存,二级缓存和查询缓存。

Hibernate中提供了两级Cache,第一级别的缓存是Session级别的缓存,它是属于事务范围的缓存。这一级别的缓存是由hibernate管理的,一般情况下无需进行干预;第二级别的缓存是SessionFactory级别的缓存,它是属于进程范围或群集范围的缓存。这一级别的缓存可以进行配 置和更改,并且可以动态加载和卸载。 Hibernate还为查询结果提供了一个查询缓存,它依赖于第二级缓存。

 

 

      二、 首先需要了解的真相:

     1、 缓存是数据库数据在内存中的临时容器,它包含了库表数据在内存中的临时拷贝,位于数据库和访问层之间。

     2、ORM在进行数据读取时,会根据缓存管理策略,首先在缓冲中查询,如果发现,则直接使用,避免数据库调用的开销。

      3、数据缓存的策略:
事务级缓存:当前事务范围内的数据缓存
应用级缓存:某个应用中的数据缓存
分布式缓存:多个应用,多个JVM之间共享缓存。分布式缓存由多个应用级缓存实例组成集群,通过某种远程机制实现各个缓存实例之间的数据同步,任何一个实例的数据修改后,将导致整个集群间的数据状态同步。

     4、Hibernate的缓存在以下情况下发挥作用:

根据主键加载实体  get,load
加载关联对象

使用HQL查询时 List,iterator

 

   5、每个事务都有单独的第一级缓存,二级缓存被同一个进程或集群范围内的所有事务共享由于每个事务都拥有单独的第一级缓存,所以一级缓存不会出现并发问题,无需 提供并发访问策略,由于多个事务会同时访问第二级缓存中相同数据,因此二级缓存必须提供适当的并发访问策略,来保证特定的事务。

   6、处于一级缓存中的对象永远不会过期,除非应用程序显式清空缓存或者清除特定的对象。而二级缓存中必须提供数据过期策略,如基于内存的缓存中的对象的最大数 目,允许对象处于缓存中的最长时间,以及允许对象处于缓存中的最长空闲时间,物理存储介质可包括内存和硬盘。对象存放在基于内存的缓存中,当内存中对象的 数目达到数据过期策略中指定上限时,就会把其余的对象写入基于硬盘的缓存中。

 

 

二. 一级缓存和二级缓存比较:

 

一级缓存:

 

1、一级缓存的数据结构是Map,用于存储查询实体。Map的key存放实体的Id,Map的value存放实体本身。所以一级缓存无法存储查询的属性。

 

2、一级缓存的生命周期与Session有关,Session产生则一级缓存创建,Session关闭则一级缓存销毁。

 

3、Get,Load,Iterator方法将读写一级缓存,而List方法只写不读一级缓存。

 

4、一级缓存不能禁用,但可以通过Session的clear方法和evict方法清理一级缓存,从而达到禁止写缓存的效果。


5、Session的save方法会写缓存,在批量插入数据时要注意对一级缓存做定时清理。Hibernate的批量处理效率不高,建议使用Session.connection()获得Jdbc连接后使用Jdbc的相关API做批处理操作

 

二级缓存:

 

1、二级缓存也称进程级的缓存或SessionFactory级的缓存,二级缓存可以被所有的session共享。

 

2、二级缓存的生命周期和SessionFactory的生命周期一致,SessionFactory可以管理二级缓存。

 

3、Hibernate 默认情况下是打开的,提供一个Hashtable存储二级缓存,但只适用于研发,开发中为第三方缓存组件提供了接入接口,我们可以根据不同情况选择不同的实现。

 

4、二级缓存也只能缓存实体对象,不缓存属性。

 

5、ehcache二级缓存的配置和使用:
* 将echcache.xml文件拷贝到src下
* 开启二级缓存,修改hibernate.cfg.xml文件
<property name="hibernate.cache.use_second_level_cache">true</property>
* 指定缓存产品提供商,修改hibernate.cfg.xml文件
<property           name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>

 

* 指定哪些实体类使用二级缓存(两种方法
  1)在映射文件中采用<cache>标签
  2)在hibernate.cfg.xml文件中,采用<class-cache>标签

 

 二级缓存的特性:

 

1、Get,Load,Iterator方法读写二级缓存,而List方法只写不读二级缓存

 

2、设置<property name=“hibernate.cache.use_second_level_cache”>fasle</property>可以禁用二级缓存。

 

3、在一次Session交互中,可以设置Session的CacheMode为Put来禁用读操作,设置CacheMode为Get来禁用写操作。

 

4、 也可以通过SessionFacotry的evict方法清理二级缓存来达到禁止写二级缓存的效果

    

 查询缓存:

 

1、查询缓存是针对普通属性结果集的缓存,对实体对象的结果集只缓存id 。

 

2、查询缓存的生命周期为当前关联的表发生修改,那么查询缓存生命周期结束。

 

3、查询缓存的配置和使用:
* 在hibernate.cfg.xml文件中启用查询缓存,如:
<property name="hibernate.cache.use_query_cache">true</property>


* 在程序中必须手动启用查询缓存,如:
query.setCacheable(true);


4、List方法读写查询缓存,Iterator不读查询缓存 。  二级缓存和查询缓存搭配使用效果最佳

 

4
1
分享到:
评论
25 楼 duoduodeai 2014-08-19  
white_crucifix 写道
引用
看来你认真了,好吧,不跟你贫了。没必要跟你争太多,伤和气。说说的我想法或者补充下你刚才说过的不足。缓存本身已经不再是外围化的东西,很多情况下构建缓存系统确实能够减少数据库访问,提升程序执行效率。Hibernate我最早是从08年开始用,我承认在那个年代确是不错,开发实惠,提升生产效率,但是随着项目或者说应用场景的变化,Hibernate我已经渐渐不用,逐渐替代的是使用原生的JDBC API+XX的TDDL,因为数据库会做垂直分库和水平分区,逐步会将原来的一个库,拆分为几十个库,每一张业务表打打散1024甚至更多的表,而利用TDDL做数据路由,中间牵扯的缓存更多是靠Redis去抗,我明白你想表达什么,你其实是想说Hibernate的二级缓存,OK,我再次不多做评论,就之前的言论和不和谐的故意跟你斗嘴,我还是跟你说声对不起。当然你也应该不是这么小气的人,工作之余开个玩笑,斗个嘴还是情有可原的吧,呵呵。


你看,这样的纯技术讨论不是要比瞎得瑟来的有意义的多。而且我觉得你说的是对的,同时一点也不存在矛盾,你的特定环境是大数据+复杂业务,比如电信级,电商级,银行级的系统,当然自己做控制能比用框架更细致,甚至像xx公司还自己增强了jee容器。
但是如果去掉了这个前提,还是固执的坚持,就显得有点不够谨慎了。

至于道歉什么的就不需要了,每个人做的事情说过的话表现出的状态都是无可挽回的

不过重要的是,学到东西就好了

呵呵
24 楼 white_crucifix 2014-08-19  
引用
看来你认真了,好吧,不跟你贫了。没必要跟你争太多,伤和气。说说的我想法或者补充下你刚才说过的不足。缓存本身已经不再是外围化的东西,很多情况下构建缓存系统确实能够减少数据库访问,提升程序执行效率。Hibernate我最早是从08年开始用,我承认在那个年代确是不错,开发实惠,提升生产效率,但是随着项目或者说应用场景的变化,Hibernate我已经渐渐不用,逐渐替代的是使用原生的JDBC API+XX的TDDL,因为数据库会做垂直分库和水平分区,逐步会将原来的一个库,拆分为几十个库,每一张业务表打打散1024甚至更多的表,而利用TDDL做数据路由,中间牵扯的缓存更多是靠Redis去抗,我明白你想表达什么,你其实是想说Hibernate的二级缓存,OK,我再次不多做评论,就之前的言论和不和谐的故意跟你斗嘴,我还是跟你说声对不起。当然你也应该不是这么小气的人,工作之余开个玩笑,斗个嘴还是情有可原的吧,呵呵。


你看,这样的纯技术讨论不是要比瞎得瑟来的有意义的多。而且我觉得你说的是对的,同时一点也不存在矛盾,你的特定环境是大数据+复杂业务,比如电信级,电商级,银行级的系统,当然自己做控制能比用框架更细致,甚至像xx公司还自己增强了jee容器。
但是如果去掉了这个前提,还是固执的坚持,就显得有点不够谨慎了。

至于道歉什么的就不需要了,每个人做的事情说过的话表现出的状态都是无可挽回的

不过重要的是,学到东西就好了
23 楼 duoduodeai 2014-08-19  
white_crucifix 写道
@duoduodeai
告诉你没关系,只是我比较好奇的是:你这样像二流子一样说话姿态,是真的觉得理直气壮觉得自己是对的?还是因为我让你下不了台面,你只能靠这种阴阳怪气的状态假装强势。
不过我强求你回答我这个问题(事实上你几乎没有正面回答过我任何问题),这只是我一点点好奇。

事实上关于hibernate缓存,博主正文,和我在前面几楼已经有了一定的阐述。当然我知道你是一个学习能力很差的人,从你的博客就能能看出。所以我再次简单讲解一下。

以下是正文:
    我们都知道在大数据下如果每次都从db中查询会消耗大量时间,特别是数据涉及到多表连接查询时,于是缓存成为一种不错的解决方案。而hibernate作为一个ORM框架,将Java对象和数据库模型关联起来的同时,也给我们提供了自动化的缓存策略。
   比如:当我们插入一条数据时,会将对应的java实例put到缓存中去,当我们删除一条数据时,会从缓存中删除这个对象。
   事实上类似的操作并没有什么深的技巧,任何一个人都能写,如果独立使用cache,你可以在insert完以后调用cache.put,也就是两行代码而已。但是,所谓框架,是起着让开发人员更关心业务,而减少关注技术本身的作用。如果我在insert代码调用的同时,就能完成put入cache,这不是一种很良好的设计吗?另一个优秀的框架spring框架,也已经集成了cache扩展,你可以在增删改查的方法上添加@cache注解,通过外置的ehcache等缓存实现,来做上面提到的操作,这和hibernate是一样的。所以,你是不是还要因此喷spring?
    hibernate相比于spring jdbc或者mybatis,它更像是一个server级软件,而不是工具,与db的交互,必须包含在一个所谓叫“会话session”的逻辑范围内,这个范围内,就是第一级缓存,这个级别的缓存,会在session结束,也就是你这个功能执行结束后全部销毁。所以我说这个一级缓存作用不大。
     我们需要的场景是,我今天list了100条数据,明天可能需要查看某一条数据,我们不想去数据库中查询了,而从缓存中读取。这就需要二级缓存,而缓存实现可以使用第三方成熟的工具,如ehcache,如memcached。因为这个缓存是全局的,所以只要miss率好,你的系统性能就能显著提高。所以我说二级缓存才是hibernate的核心缓存。hibernate所做的就是在增删改查,级联查询,批量处理等巨多细节中,帮开发人员完成了一些细枝末节的逻辑,让开发人员在代码中不出现缓操作存逻辑的情况下,底层却使用了缓存提高性能。同时,还可以通过大量的细节参数进行调整,对性能进行调优。
    我不知道你为什么大谈什么分布式,在我看来这是很幼稚的说法。小孩子才看分布式,大人只关注缓存本质。 对于使用者来说,分布式和本地缓存差别是不大的,或者说是透明的,就像操作一个map一样。至于数据怎么切片,节点之间怎么通信,和常规的使用并没有直接的联系。

    我非常怀疑你有没有耐心能看完长文,这就是我一直不愿意和你说的原因,但是容我再好奇一次,:你撒泼了这么久,真的还记得自己最初想说明的观点是什么吗?我觉得你已经迷茫了。。。


对了,想起你一直出于心虚想问我工作什么什么,干过些什么什么。我就一并告诉你吧。包括研究生实习一并工作4.5年+,从前端到底层都干过,谦虚点讲是打酱油。最喜欢用的ui框架是bootstrap,用的比一般人要好的是Extjs,现在热衷于angularJS,它完全符合我的口味。web后台主要还是java,现在的springMVC,以前用ssh都ok。还有前端Java- GWT也给公司和学校做过系统。底层部分,出于工作要求,读过activemq,cassandra等存储类server(nosql)的部分源码,修改源码+开发底层替代模块。做过mysql集群的管理系统。用perl写过两个月web gui自动化测试工具,用java写过nosql读写性能测试工具。打过perl,php,python等等真酱油。。。另外,我还喜欢nodejs。。。虽然工作上用不到。。。


white_crucifix 写道
@duoduodeai
告诉你没关系,只是我比较好奇的是:你这样像二流子一样说话姿态,是真的觉得理直气壮觉得自己是对的?还是因为我让你下不了台面,你只能靠这种阴阳怪气的状态假装强势。
不过我强求你回答我这个问题(事实上你几乎没有正面回答过我任何问题),这只是我一点点好奇。

事实上关于hibernate缓存,博主正文,和我在前面几楼已经有了一定的阐述。当然我知道你是一个学习能力很差的人,从你的博客就能能看出。所以我再次简单讲解一下。

以下是正文:
    我们都知道在大数据下如果每次都从db中查询会消耗大量时间,特别是数据涉及到多表连接查询时,于是缓存成为一种不错的解决方案。而hibernate作为一个ORM框架,将Java对象和数据库模型关联起来的同时,也给我们提供了自动化的缓存策略。
   比如:当我们插入一条数据时,会将对应的java实例put到缓存中去,当我们删除一条数据时,会从缓存中删除这个对象。
   事实上类似的操作并没有什么深的技巧,任何一个人都能写,如果独立使用cache,你可以在insert完以后调用cache.put,也就是两行代码而已。但是,所谓框架,是起着让开发人员更关心业务,而减少关注技术本身的作用。如果我在insert代码调用的同时,就能完成put入cache,这不是一种很良好的设计吗?另一个优秀的框架spring框架,也已经集成了cache扩展,你可以在增删改查的方法上添加@cache注解,通过外置的ehcache等缓存实现,来做上面提到的操作,这和hibernate是一样的。所以,你是不是还要因此喷spring?
    hibernate相比于spring jdbc或者mybatis,它更像是一个server级软件,而不是工具,与db的交互,必须包含在一个所谓叫“会话session”的逻辑范围内,这个范围内,就是第一级缓存,这个级别的缓存,会在session结束,也就是你这个功能执行结束后全部销毁。所以我说这个一级缓存作用不大。
     我们需要的场景是,我今天list了100条数据,明天可能需要查看某一条数据,我们不想去数据库中查询了,而从缓存中读取。这就需要二级缓存,而缓存实现可以使用第三方成熟的工具,如ehcache,如memcached。因为这个缓存是全局的,所以只要miss率好,你的系统性能就能显著提高。所以我说二级缓存才是hibernate的核心缓存。hibernate所做的就是在增删改查,级联查询,批量处理等巨多细节中,帮开发人员完成了一些细枝末节的逻辑,让开发人员在代码中不出现缓操作存逻辑的情况下,底层却使用了缓存提高性能。同时,还可以通过大量的细节参数进行调整,对性能进行调优。
    我不知道你为什么大谈什么分布式,在我看来这是很幼稚的说法。小孩子才看分布式,大人只关注缓存本质。 对于使用者来说,分布式和本地缓存差别是不大的,或者说是透明的,就像操作一个map一样。至于数据怎么切片,节点之间怎么通信,和常规的使用并没有直接的联系。

    我非常怀疑你有没有耐心能看完长文,这就是我一直不愿意和你说的原因,但是容我再好奇一次,:你撒泼了这么久,真的还记得自己最初想说明的观点是什么吗?我觉得你已经迷茫了。。。


对了,想起你一直出于心虚想问我工作什么什么,干过些什么什么。我就一并告诉你吧。包括研究生实习一并工作4.5年+,从前端到底层都干过,谦虚点讲是打酱油。最喜欢用的ui框架是bootstrap,用的比一般人要好的是Extjs,现在热衷于angularJS,它完全符合我的口味。web后台主要还是java,现在的springMVC,以前用ssh都ok。还有前端Java- GWT也给公司和学校做过系统。底层部分,出于工作要求,读过activemq,cassandra等存储类server(nosql)的部分源码,修改源码+开发底层替代模块。做过mysql集群的管理系统。用perl写过两个月web gui自动化测试工具,用java写过nosql读写性能测试工具。打过perl,php,python等等真酱油。。。另外,我还喜欢nodejs。。。虽然工作上用不到。。。


white_crucifix 写道
@duoduodeai
告诉你没关系,只是我比较好奇的是:你这样像二流子一样说话姿态,是真的觉得理直气壮觉得自己是对的?还是因为我让你下不了台面,你只能靠这种阴阳怪气的状态假装强势。
不过我强求你回答我这个问题(事实上你几乎没有正面回答过我任何问题),这只是我一点点好奇。

事实上关于hibernate缓存,博主正文,和我在前面几楼已经有了一定的阐述。当然我知道你是一个学习能力很差的人,从你的博客就能能看出。所以我再次简单讲解一下。

以下是正文:
    我们都知道在大数据下如果每次都从db中查询会消耗大量时间,特别是数据涉及到多表连接查询时,于是缓存成为一种不错的解决方案。而hibernate作为一个ORM框架,将Java对象和数据库模型关联起来的同时,也给我们提供了自动化的缓存策略。
   比如:当我们插入一条数据时,会将对应的java实例put到缓存中去,当我们删除一条数据时,会从缓存中删除这个对象。
   事实上类似的操作并没有什么深的技巧,任何一个人都能写,如果独立使用cache,你可以在insert完以后调用cache.put,也就是两行代码而已。但是,所谓框架,是起着让开发人员更关心业务,而减少关注技术本身的作用。如果我在insert代码调用的同时,就能完成put入cache,这不是一种很良好的设计吗?另一个优秀的框架spring框架,也已经集成了cache扩展,你可以在增删改查的方法上添加@cache注解,通过外置的ehcache等缓存实现,来做上面提到的操作,这和hibernate是一样的。所以,你是不是还要因此喷spring?
    hibernate相比于spring jdbc或者mybatis,它更像是一个server级软件,而不是工具,与db的交互,必须包含在一个所谓叫“会话session”的逻辑范围内,这个范围内,就是第一级缓存,这个级别的缓存,会在session结束,也就是你这个功能执行结束后全部销毁。所以我说这个一级缓存作用不大。
     我们需要的场景是,我今天list了100条数据,明天可能需要查看某一条数据,我们不想去数据库中查询了,而从缓存中读取。这就需要二级缓存,而缓存实现可以使用第三方成熟的工具,如ehcache,如memcached。因为这个缓存是全局的,所以只要miss率好,你的系统性能就能显著提高。所以我说二级缓存才是hibernate的核心缓存。hibernate所做的就是在增删改查,级联查询,批量处理等巨多细节中,帮开发人员完成了一些细枝末节的逻辑,让开发人员在代码中不出现缓操作存逻辑的情况下,底层却使用了缓存提高性能。同时,还可以通过大量的细节参数进行调整,对性能进行调优。
    我不知道你为什么大谈什么分布式,在我看来这是很幼稚的说法。小孩子才看分布式,大人只关注缓存本质。 对于使用者来说,分布式和本地缓存差别是不大的,或者说是透明的,就像操作一个map一样。至于数据怎么切片,节点之间怎么通信,和常规的使用并没有直接的联系。

    我非常怀疑你有没有耐心能看完长文,这就是我一直不愿意和你说的原因,但是容我再好奇一次,:你撒泼了这么久,真的还记得自己最初想说明的观点是什么吗?我觉得你已经迷茫了。。。


对了,想起你一直出于心虚想问我工作什么什么,干过些什么什么。我就一并告诉你吧。包括研究生实习一并工作4.5年+,从前端到底层都干过,谦虚点讲是打酱油。最喜欢用的ui框架是bootstrap,用的比一般人要好的是Extjs,现在热衷于angularJS,它完全符合我的口味。web后台主要还是java,现在的springMVC,以前用ssh都ok。还有前端Java- GWT也给公司和学校做过系统。底层部分,出于工作要求,读过activemq,cassandra等存储类server(nosql)的部分源码,修改源码+开发底层替代模块。做过mysql集群的管理系统。用perl写过两个月web gui自动化测试工具,用java写过nosql读写性能测试工具。打过perl,php,python等等真酱油。。。另外,我还喜欢nodejs。。。虽然工作上用不到。。。



看来你认真了,好吧,不跟你贫了。没必要跟你争太多,伤和气。说说的我想法或者补充下你刚才说过的不足。缓存本身已经不再是外围化的东西,很多情况下构建缓存系统确实能够减少数据库访问,提升程序执行效率。Hibernate我最早是从08年开始用,我承认在那个年代确是不错,开发实惠,提升生产效率,但是随着项目或者说应用场景的变化,Hibernate我已经渐渐不用,逐渐替代的是使用原生的JDBC API+XX的TDDL,因为数据库会做垂直分库和水平分区,逐步会将原来的一个库,拆分为几十个库,每一张业务表打打散1024甚至更多的表,而利用TDDL做数据路由,中间牵扯的缓存更多是靠Redis去抗,我明白你想表达什么,你其实是想说Hibernate的二级缓存,OK,我再次不多做评论,就之前的言论和不和谐的故意跟你斗嘴,我还是跟你说声对不起。当然你也应该不是这么小气的人,工作之余开个玩笑,斗个嘴还是情有可原的吧,呵呵。

22 楼 white_crucifix 2014-08-19  
@duoduodeai
告诉你没关系,只是我比较好奇的是:你这样像二流子一样说话姿态,是真的觉得理直气壮觉得自己是对的?还是因为我让你下不了台面,你只能靠这种阴阳怪气的状态假装强势。
不过我强求你回答我这个问题(事实上你几乎没有正面回答过我任何问题),这只是我一点点好奇。

事实上关于hibernate缓存,博主正文,和我在前面几楼已经有了一定的阐述。当然我知道你是一个学习能力很差的人,从你的博客就能能看出。所以我再次简单讲解一下。

以下是正文:
    我们都知道在大数据下如果每次都从db中查询会消耗大量时间,特别是数据涉及到多表连接查询时,于是缓存成为一种不错的解决方案。而hibernate作为一个ORM框架,将Java对象和数据库模型关联起来的同时,也给我们提供了自动化的缓存策略。
   比如:当我们插入一条数据时,会将对应的java实例put到缓存中去,当我们删除一条数据时,会从缓存中删除这个对象。
   事实上类似的操作并没有什么深的技巧,任何一个人都能写,如果独立使用cache,你可以在insert完以后调用cache.put,也就是两行代码而已。但是,所谓框架,是起着让开发人员更关心业务,而减少关注技术本身的作用。如果我在insert代码调用的同时,就能完成put入cache,这不是一种很良好的设计吗?另一个优秀的框架spring框架,也已经集成了cache扩展,你可以在增删改查的方法上添加@cache注解,通过外置的ehcache等缓存实现,来做上面提到的操作,这和hibernate是一样的。所以,你是不是还要因此喷spring?
    hibernate相比于spring jdbc或者mybatis,它更像是一个server级软件,而不是工具,与db的交互,必须包含在一个所谓叫“会话session”的逻辑范围内,这个范围内,就是第一级缓存,这个级别的缓存,会在session结束,也就是你这个功能执行结束后全部销毁。所以我说这个一级缓存作用不大。
     我们需要的场景是,我今天list了100条数据,明天可能需要查看某一条数据,我们不想去数据库中查询了,而从缓存中读取。这就需要二级缓存,而缓存实现可以使用第三方成熟的工具,如ehcache,如memcached。因为这个缓存是全局的,所以只要miss率好,你的系统性能就能显著提高。所以我说二级缓存才是hibernate的核心缓存。hibernate所做的就是在增删改查,级联查询,批量处理等巨多细节中,帮开发人员完成了一些细枝末节的逻辑,让开发人员在代码中不出现缓操作存逻辑的情况下,底层却使用了缓存提高性能。同时,还可以通过大量的细节参数进行调整,对性能进行调优。
    我不知道你为什么大谈什么分布式,在我看来这是很幼稚的说法。小孩子才看分布式,大人只关注缓存本质。 对于使用者来说,分布式和本地缓存差别是不大的,或者说是透明的,就像操作一个map一样。至于数据怎么切片,节点之间怎么通信,和常规的使用并没有直接的联系。

    我非常怀疑你有没有耐心能看完长文,这就是我一直不愿意和你说的原因,但是容我再好奇一次,:你撒泼了这么久,真的还记得自己最初想说明的观点是什么吗?我觉得你已经迷茫了。。。


对了,想起你一直出于心虚想问我工作什么什么,干过些什么什么。我就一并告诉你吧。包括研究生实习一并工作4.5年+,从前端到底层都干过,谦虚点讲是打酱油。最喜欢用的ui框架是bootstrap,用的比一般人要好的是Extjs,现在热衷于angularJS,它完全符合我的口味。web后台主要还是java,现在的springMVC,以前用ssh都ok。还有前端Java- GWT也给公司和学校做过系统。底层部分,出于工作要求,读过activemq,cassandra等存储类server(nosql)的部分源码,修改源码+开发底层替代模块。做过mysql集群的管理系统。用perl写过两个月web gui自动化测试工具,用java写过nosql读写性能测试工具。打过perl,php,python等等真酱油。。。另外,我还喜欢nodejs。。。虽然工作上用不到。。。

21 楼 duoduodeai 2014-08-19  
white_crucifix 写道
duoduodeai 写道
white_crucifix 写道
@duoduodeai
哦,那好吧,先列一个谈话的提纲,免得你又越飘越远

首先,我希望你先阐述一下hibernate的缓存机制,越详细越好,因为我们谈的是hibernate缓存,我必须要确认你了解这一点,我才能相信你说的任何信息是有价值的

然后,你可以从中挑出一些hibernate缓存中的不足,比如相比于我们直接使用缓存工具,不附着于hibernate,有哪些劣势

最后说一点。。。2014年了。。。“哥哥,哥哥”已经不流行了,这TM都是高中时代的风格。。。


那你叫我爷吧,我受得起。
这样吧,我一点都不了解缓存,也不懂什么是缓存。
要不您告诉我吧?我百度了,也谷妹了,但是感觉还是听您说更有感觉。


所以,你对一个你不了解的领域,大言不惭,是吗?

不是,只是对你而言,我觉得有必要听你说,你这么牛逼,吹的这么高大上,我们在您面前肯定是什么都不知道了啊,肯定要听您高见啊,来看我的嘴型:“什么是缓存?为什么用缓存?”
20 楼 white_crucifix 2014-08-19  
duoduodeai 写道
white_crucifix 写道
@duoduodeai
哦,那好吧,先列一个谈话的提纲,免得你又越飘越远

首先,我希望你先阐述一下hibernate的缓存机制,越详细越好,因为我们谈的是hibernate缓存,我必须要确认你了解这一点,我才能相信你说的任何信息是有价值的

然后,你可以从中挑出一些hibernate缓存中的不足,比如相比于我们直接使用缓存工具,不附着于hibernate,有哪些劣势

最后说一点。。。2014年了。。。“哥哥,哥哥”已经不流行了,这TM都是高中时代的风格。。。


那你叫我爷吧,我受得起。
这样吧,我一点都不了解缓存,也不懂什么是缓存。
要不您告诉我吧?我百度了,也谷妹了,但是感觉还是听您说更有感觉。


所以,你对一个你不了解的领域,大言不惭,是吗?
19 楼 duoduodeai 2014-08-19  
white_crucifix 写道
@duoduodeai
哦,那好吧,先列一个谈话的提纲,免得你又越飘越远

首先,我希望你先阐述一下hibernate的缓存机制,越详细越好,因为我们谈的是hibernate缓存,我必须要确认你了解这一点,我才能相信你说的任何信息是有价值的

然后,你可以从中挑出一些hibernate缓存中的不足,比如相比于我们直接使用缓存工具,不附着于hibernate,有哪些劣势

最后说一点。。。2014年了。。。“哥哥,哥哥”已经不流行了,这TM都是高中时代的风格。。。


那你叫我爷吧,我受得起。
这样吧,我一点都不了解缓存,也不懂什么是缓存。
要不您告诉我吧?我百度了,也谷妹了,但是感觉还是听您说更有感觉。
18 楼 white_crucifix 2014-08-19  
@duoduodeai
哦,那好吧,先列一个谈话的提纲,免得你又越飘越远

首先,我希望你先阐述一下hibernate的缓存机制,越详细越好,因为我们谈的是hibernate缓存,我必须要确认你了解这一点,我才能相信你说的任何信息是有价值的

然后,你可以从中挑出一些hibernate缓存中的不足,比如相比于我们直接使用缓存工具,不附着于hibernate,有哪些劣势

最后说一点。。。2014年了。。。“哥哥,哥哥”已经不流行了,这TM都是高中时代的风格。。。
17 楼 duoduodeai 2014-08-19  
white_crucifix 写道
叁顿饭的忧愁 写道

我觉得两位说的都不错,小弟我是从事开发没多久(不到一年)。我仔细想了想你们的话,都有各自的道理。hibernate在缓存这方面我不是很懂,本身在缓存这里没有一套标准。确实,在现在硬件逐步便宜的时代,硬件缓存确实比较牛,也好很多。但hibernate也还不错啦。至少面向的对象的开发确实很方便。而且退一步说,如果没有hibernate缓存或者ibitis缓存什么,内存的浪费也是存在的,这样只是增加的硬件的成本。   我觉得你们像是一个DBA和一个程序员在讨论缓存问题,角度有点不一样,我在你们讨论中进步了。共同学习!



呵呵,其实后面还有精彩的10层对攻战被teye吃掉了呢~~

其实hibernate这东西之所以争议那么大,的确是因为它的学习曲线抖,用好它的能力是需要积累的。它不像spring jdbc,不像mybatis,拿起来就开始写sql,就能跑出结果,轻便,简单。它更像是一个server级的软件,而不是jdbc工具。

Hibernate的缓存在某种意义上是为了弥补它的缺陷而生的,而这个缺陷就是OO。是不是觉得很诡异,OO作为h的一大优点,为什么在这里成为缺陷。举个例子,我通过user id查出一个用户,再根据用户的一个属性book id,级连查询书的信息。这本一个级连的sql,在h里却会分裂成两个SQL,增加数据库交互的次数。这就是h的原罪,为了面向对象而产生的原罪。因此为了提高性能,引入了缓存机制。

一级缓存作用域很小,用处不大,查询缓存受查询条件限制,用处也局限,因此h的二级缓存才是核心的,因为二级缓存可以看成是全局的对象缓存,试想一下,在一个读频繁的场景下,我对于这个用户和书的获取再也不用交互数据库了,这是多么提升性能啊。。。


事实上在网上大吵大闹谈硬件的大多数都是不够格的,可以试问一下软件层面已经研究到瓶颈了吗,会优化jvm吗,了解java内存模型吗,这些才是体现能力的地方。而不是大谈我有分布式,我有几十个G的ssd。

我喷他是因为他的论点牛头不对马嘴,一看就知道并不了解,也不愿意去了解,人云亦云。看他第一句话,很明显,他以为h有一套自己的缓存实现,事实上h最主要的缓存其实是接第三方。。。。

回楼上,你工作一年不到慢慢来,如果有机会在工作中能涉及到阅读源码的事情也努力去做一下,开始会有点痛苦。当你有一定积累以后,你会看到很多人看不到的东西。也就更清楚有些东西到底好在哪里,劣在哪里,是为了解决什么问题而出现的,这个工具的本质是什么。比如世界上绝大多数的web框架本质是一模一样的,你任何一个语言的web框架丢给我我都能在很短时间内弄出一个相同的系统,学习的过程是我去寻找这个地方的api,而不是看了doc告诉我这里应该用哪个api。

祝好运,也祝前面那位兄弟,争论的结果如果没有获益,那就是浪费了


亲,你又出来装X了吗?这段时间没登,发现您又出来嘚瑟了,我只想说你这个人一点多不实诚,总是藏着掖着,缓存的东西,你要是真的吃透了,或者你的项目够大,你就不会装X在这里冲。
本地缓存,分布式缓存,集中式缓存,你想聊哪样?哥哥今天又陪你,你不是说哥哥不了解这些吗?哥哥陪你。
16 楼 叁顿饭的忧愁 2014-08-07  
Josh_Persistence 写道
white_crucifix 写道
叁顿饭的忧愁 写道
每每看见这样的争论总是能让人心情激动,异常兴奋,从你们的争论中可以带出很多信息,也能得到很多未来学习的建议。前辈们,可以介绍几本书我看看么?我之前看完《spring揭秘》,感觉不错。现在不知道看什么书。求介绍。。。


书里提到的spring的高级特性先在实践中用起来,看看有时候理解了,用的时候会发现依然很迷茫


Java与模式,Kafka分布式消息系统,Java编程思想,Java并发编程。

谢了!前辈。
15 楼 Josh_Persistence 2014-08-06  
white_crucifix 写道
叁顿饭的忧愁 写道
每每看见这样的争论总是能让人心情激动,异常兴奋,从你们的争论中可以带出很多信息,也能得到很多未来学习的建议。前辈们,可以介绍几本书我看看么?我之前看完《spring揭秘》,感觉不错。现在不知道看什么书。求介绍。。。


书里提到的spring的高级特性先在实践中用起来,看看有时候理解了,用的时候会发现依然很迷茫


Java与模式,Kafka分布式消息系统,Java编程思想,Java并发编程。
14 楼 white_crucifix 2014-08-05  
叁顿饭的忧愁 写道
每每看见这样的争论总是能让人心情激动,异常兴奋,从你们的争论中可以带出很多信息,也能得到很多未来学习的建议。前辈们,可以介绍几本书我看看么?我之前看完《spring揭秘》,感觉不错。现在不知道看什么书。求介绍。。。


书里提到的spring的高级特性先在实践中用起来,看看有时候理解了,用的时候会发现依然很迷茫
13 楼 叁顿饭的忧愁 2014-08-05  
每每看见这样的争论总是能让人心情激动,异常兴奋,从你们的争论中可以带出很多信息,也能得到很多未来学习的建议。前辈们,可以介绍几本书我看看么?我之前看完《spring揭秘》,感觉不错。现在不知道看什么书。求介绍。。。
12 楼 white_crucifix 2014-08-05  
叁顿饭的忧愁 写道

我觉得两位说的都不错,小弟我是从事开发没多久(不到一年)。我仔细想了想你们的话,都有各自的道理。hibernate在缓存这方面我不是很懂,本身在缓存这里没有一套标准。确实,在现在硬件逐步便宜的时代,硬件缓存确实比较牛,也好很多。但hibernate也还不错啦。至少面向的对象的开发确实很方便。而且退一步说,如果没有hibernate缓存或者ibitis缓存什么,内存的浪费也是存在的,这样只是增加的硬件的成本。   我觉得你们像是一个DBA和一个程序员在讨论缓存问题,角度有点不一样,我在你们讨论中进步了。共同学习!



呵呵,其实后面还有精彩的10层对攻战被teye吃掉了呢~~

其实hibernate这东西之所以争议那么大,的确是因为它的学习曲线抖,用好它的能力是需要积累的。它不像spring jdbc,不像mybatis,拿起来就开始写sql,就能跑出结果,轻便,简单。它更像是一个server级的软件,而不是jdbc工具。

Hibernate的缓存在某种意义上是为了弥补它的缺陷而生的,而这个缺陷就是OO。是不是觉得很诡异,OO作为h的一大优点,为什么在这里成为缺陷。举个例子,我通过user id查出一个用户,再根据用户的一个属性book id,级连查询书的信息。这本一个级连的sql,在h里却会分裂成两个SQL,增加数据库交互的次数。这就是h的原罪,为了面向对象而产生的原罪。因此为了提高性能,引入了缓存机制。

一级缓存作用域很小,用处不大,查询缓存受查询条件限制,用处也局限,因此h的二级缓存才是核心的,因为二级缓存可以看成是全局的对象缓存,试想一下,在一个读频繁的场景下,我对于这个用户和书的获取再也不用交互数据库了,这是多么提升性能啊。。。


事实上在网上大吵大闹谈硬件的大多数都是不够格的,可以试问一下软件层面已经研究到瓶颈了吗,会优化jvm吗,了解java内存模型吗,这些才是体现能力的地方。而不是大谈我有分布式,我有几十个G的ssd。

我喷他是因为他的论点牛头不对马嘴,一看就知道并不了解,也不愿意去了解,人云亦云。看他第一句话,很明显,他以为h有一套自己的缓存实现,事实上h最主要的缓存其实是接第三方。。。。

回楼上,你工作一年不到慢慢来,如果有机会在工作中能涉及到阅读源码的事情也努力去做一下,开始会有点痛苦。当你有一定积累以后,你会看到很多人看不到的东西。也就更清楚有些东西到底好在哪里,劣在哪里,是为了解决什么问题而出现的,这个工具的本质是什么。比如世界上绝大多数的web框架本质是一模一样的,你任何一个语言的web框架丢给我我都能在很短时间内弄出一个相同的系统,学习的过程是我去寻找这个地方的api,而不是看了doc告诉我这里应该用哪个api。

祝好运,也祝前面那位兄弟,争论的结果如果没有获益,那就是浪费了
11 楼 叁顿饭的忧愁 2014-08-04  
duoduodeai 写道
没用的,Hibernate的缓存就是鸡肋。生产环境下谁会用?都有单独的缓存服务器做分布式缓存,缓存容量一台机器都是几十GB的。
效率也低 HQL->语法树->SQL-DBMS,这么多编译过程,慢。

white_crucifix 写道
duoduodeai 写道
没用的,Hibernate的缓存就是鸡肋。生产环境下谁会用?都有单独的缓存服务器做分布式缓存,缓存容量一台机器都是几十GB的。
效率也低 HQL->语法树->SQL-DBMS,这么多编译过程,慢。


很怪异的两句话。。。想了半天,只是弱弱地觉得,你真的懂编程语言吗?

我觉得两位说的都不错,小弟我是从事开发没多久(不到一年)。我仔细想了想你们的话,都有各自的道理。hibernate在缓存这方面我不是很懂,本身在缓存这里没有一套标准。确实,在现在硬件逐步便宜的时代,硬件缓存确实比较牛,也好很多。但hibernate也还不错啦。至少面向的对象的开发确实很方便。而且退一步说,如果没有hibernate缓存或者ibitis缓存什么,内存的浪费也是存在的,这样只是增加的硬件的成本。   我觉得你们像是一个DBA和一个程序员在讨论缓存问题,角度有点不一样,我在你们讨论中进步了。共同学习!
10 楼 duoduodeai 2014-07-31  
white_crucifix 写道
@duoduodeai
只想说你太不淡定了,说你一句就跳起来,还带着抖机灵的措辞,不恰时机的抖机灵只能凸显自己的浅薄。

告诉你为什么会觉得你前面两句话很怪异。
第一,hibernate的核心缓存(二级缓存),一般使用的就是第三方缓存实现。分布式缓存也好,单机缓存也好,和hibernate没有半毛钱关系,只是接在hibernate上而已。

第二,“效率也低 HQL->语法树->SQL-DBMS,这么多编译过程,慢。 ”
这跟编译有半毛钱关系,java的编译有两处,第一是编译成class文件,和运行时无关。第二是运行时将频繁访问的方法编译成本地码,加速性能。你说的是指调用层次多,但是调用层次多对性能影响微乎其微。



我只想问你,你工作几年了?
谁告诉Hibernate的核心是缓存?还二级缓存?ok,退一万步讲,二级缓存就算你用了?你用什么承载二级缓存?Ehcache?memcache?请问您真的理解分布式和集群的区别吗?
我觉得你好有意思,自己说Hibernate的核心缓存是二级缓存,却又说二级缓存实现跟Hibernate没关系,你可真逗。
其次Hibernate你到底用过没?你直到拿来干嘛的?

第二个问题,你到底懂不懂SQL编译执行过程?跟你说SQL的解析过程,你要扯到byteCode上,亲,你这是牛头不对马嘴。

你到底懂不懂数据库访问?
9 楼 white_crucifix 2014-07-31  
@duoduodeai
只想说你太不淡定了,说你一句就跳起来,还带着抖机灵的措辞,不恰时机的抖机灵只能凸显自己的浅薄。

告诉你为什么会觉得你前面两句话很怪异。
第一,hibernate的核心缓存(二级缓存),一般使用的就是第三方缓存实现。分布式缓存也好,单机缓存也好,和hibernate没有半毛钱关系,只是接在hibernate上而已。

第二,“效率也低 HQL->语法树->SQL-DBMS,这么多编译过程,慢。 ”
这跟编译有半毛钱关系,java的编译有两处,第一是编译成class文件,和运行时无关。第二是运行时将频繁访问的方法编译成本地码,加速性能。你说的是指调用层次多,但是调用层次多对性能影响微乎其微。
8 楼 duoduodeai 2014-07-31  
white_crucifix 写道
duoduodeai 写道
是不会把这种基础知识,况且没多大实际用处的东西搬上来。


哪种?

没事,当我没说。你按照你的想法就可以了。
7 楼 white_crucifix 2014-07-31  
duoduodeai 写道
是不会把这种基础知识,况且没多大实际用处的东西搬上来。


哪种?
6 楼 duoduodeai 2014-07-31  
,说说你这么断定的理由。如果你说不出,我可以告诉你我刚才推断的理由。当然,你可以让我先说。
white_crucifix 写道
duoduodeai 写道
white_crucifix 写道
duoduodeai 写道
没用的,Hibernate的缓存就是鸡肋。生产环境下谁会用?都有单独的缓存服务器做分布式缓存,缓存容量一台机器都是几十GB的。
效率也低 HQL->语法树->SQL-DBMS,这么多编译过程,慢。


很怪异的两句话。。。想了半天,只是弱弱地觉得,你真的懂编程语言吗?


不懂啊,但是同样也可以断定你没工作几年,也是门外汉。
大哥不要笑二哥,大家都差不多。


那么,说说你这么断定的理由。如果你说不出,我可以告诉你我刚才推断的理由。当然,你可以让我先说。


我不懂编程语言,是因为家里穷,没钱供我去学习计算机,我只能在网吧从互联网上吸取知识,尽管我学习的不全面,非科班出生,但是我也算是懂一些,哪怕是一点点把,但是我最起码知道的是,工作久了的人,是不会把这种基础知识,况且没多大实际用处的东西搬上来。

相关推荐

    HIBERNATE的缓存机制

    Hibernate缓存机制是提高应用程序性能的关键特性,尤其是在频繁与数据库交互的应用中。缓存通过减少对物理数据库的直接访问次数,显著提升了数据读取和写入的速度。这主要是因为从缓存中读取数据比从数据库中获取更...

    Hibernate一级缓存、二级缓存以及查询缓存实例

    例如,当我们第一次从数据库加载一个实体后,再次请求该实体时,Hibernate会首先在一级缓存中查找,而不会去数据库查询,从而提高了性能。在实际项目中,合理利用一级缓存可以显著减少数据库的负载。 接下来是二级...

    Hibernate缓存深入详解

    【Hibernate缓存深入详解】 在Java的持久化框架Hibernate中,缓存机制是提升系统性能的关键因素。它位于Hibernate应用和数据库之间,减少了对数据库的直接访问,从而提高了应用程序的运行速度。缓存中存储的是...

    Hibernate缓存技术研究

    ### Hibernate缓存技术研究 #### 一、引言 Hibernate是一种强大的对象-关系映射(Object-Relational Mapping,简称ORM)工具,主要用于Java环境下的应用程序。它能够将应用程序中的对象模型映射到关系型数据库的表...

    Hibernate的缓存策略

    - **数据一致性问题**:由于二级缓存中的数据是数据库数据的副本,因此需要解决数据一致性的问题。通常情况下,可以通过配置缓存策略(如读写策略、刷新策略等)来保证数据的一致性和有效性。 - **性能优化**:合理...

    管理Hibernate的缓存

    管理Hibernate的缓存缓存 管理Hibernate的缓存缓存

    hibernate一级缓存和二级缓存的区别与联系

    二级缓存中存储的是对象的集合数据,而不是单个对象实例,这样可以更高效地处理大量数据。二级缓存可以通过设置不同的并发访问策略来解决并发问题,如事务型、读写型或非严格读写型,以适应不同场景下的需求。 持久...

    Hibernate缓存,性能优化

    当会话关闭时,一级缓存中的数据会被清除。一级缓存的主要作用是减少对数据库的查询次数,提高应用程序的响应速度。 二级缓存是一种可选的缓存策略,用于在不同的会话之间共享数据。它通常由第三方缓存提供者(如...

    Hibernate缓存深入详解 from ITEye

    当实体被持久化时,会自动放入一级缓存,读取数据时也会优先从一级缓存中查找。一级缓存默认开启且无法关闭,具有事务隔离性,即在同一个事务中修改的数据,只有在事务提交后才会对其他事务可见。 **三、二级缓存**...

    Hibernate缓存.doc

    Hibernate缓存.docHibernate缓存.doc

    Hibernate二级缓存

    Hibernate二级缓存是一种提高应用程序性能的技术,它将数据存储在SessionFactory级别的缓存中,使得数据可以在不同的Session之间共享。这与一级缓存(Session级别)不同,一级缓存仅存在于单个Session生命周期内,当...

    hibernate一级缓存、二级缓存和查询缓存

    每当我们在Session中进行对象的CRUD(创建、读取、更新、删除)操作时,这些操作实际上并未立即同步到数据库,而是被暂时保存在一级缓存中。一级缓存的特点如下: - **生命周期与Session一致**:一级缓存的生命周期...

    hibernate缓存ehcache用法

    这篇博客文章“hibernate缓存ehcache用法”可能详细介绍了如何在Hibernate中配置和使用Ehcache。 首先,我们需要理解什么是缓存。缓存是一种存储技术,用于临时保存经常访问的数据,以减少对主存储器(如数据库)的...

    hibernate的缓存机制

    当我们在Session中对对象进行操作时,如保存、更新或删除,Hibernate首先会检查这个对象是否已经在一级缓存中。如果在,那么直接在内存中处理,而不会立即触达数据库。一级缓存默认开启,且生命周期与Session相同,...

    hibernate的缓存机制和session对象的产生方式案例

    每次当我们通过Session对象进行CRUD(创建、读取、更新、删除)操作时,Hibernate都会在一级缓存中处理这些对象。例如,当你从数据库中加载一个实体时,它会被放入一级缓存;当你修改这个实体并调用flush()方法时,...

    hibernate 二级缓存详解

    不过,list操作不会使用缓存,而iterate则会先获取所有ID,然后逐个load,如果ID已在缓存中,则从缓存获取,否则从数据库加载。使用`&lt;cache usage="read-write"&gt;`配置,表示使用读写缓存策略,当实体被修改时,...

    hibernate缓存机制

    Hibernate缓存机制是提高应用程序性能的关键技术之一,它通过存储数据副本减少对物理数据库的访问。缓存可以分为两层:第一级缓存和第二级缓存。 **第一级缓存**是内置在Session中的,它是不可卸载的,也称为...

    hibernate二级缓存实例

    在Java的持久化框架Hibernate中,二级缓存是提高数据访问效率的重要机制。它是一种全局共享的、跨会话的数据存储区域,旨在减少对数据库的直接访问,从而降低系统负载,提升性能。在这个"hibernate二级缓存实例"中,...

Global site tag (gtag.js) - Google Analytics