本篇随笔里将会分析一下hibernate的缓存机制,包括一级缓存(session级别).二级缓存(sessionFactory级别)以及查询缓存,当然还要讨论下我们的N+1的问题. 随笔虽长,但我相信看完的朋友绝对能对hibernate的 N+1问题以及缓存有更深的了解. 一.N+1问题 首先我们来探讨一下N+1的问题,我们先通过一个例子来看一下,什么是N+1问题: list()获得对象: /** * 此时会发出一条sql,将30个学生全部查询出来 */ List<Student> ls =…
缓存 就是把本来应该放在硬盘里的东西放在内存里  将来存内存里读 一级缓存: session缓存 二级缓存: sessionFactory级别的   (适合经常访问,数据量有限,改动不大) 很多的session缓存  找不到再去数据库拿 开启二级缓存 查询缓存 比如说 我查的是2-8的数据 然后呢我又查了3-9的数据 则3-8的数据就是查询缓存,三级缓存 缓存算法 内存对象满了 拿走什么 Lru Lfu fifo 1.最近很少被使用 2.最近不常被使用 3.缓存对象设置一个数组 来一个把第一个推…
说说自己对hibernate一级.二级.查询.缓存的理解. 2016-03-14 21:36 421人阅读 评论(0) 收藏 举报  分类: web开发(19)  版权声明:本文为博主原创文章,未经博主允许不得转载. 今天面试碰到答不上来..马上回家查了下,现在写下对hibernate缓存的理解以加深印象. 1.一级缓存 可以简单的理解为session缓存,即同一个session中使用get.load.迭代,会优先重缓存中取,如果没有则查询数据库并存入缓存,session关闭后缓存清空 2.二级…
二级缓存(sessionFactory): Hibernate的二级缓存由SessionFactory对象管理,是应用级别的缓存.它可以缓存整个应用的持久化对象,所以又称为“SessionFactory缓存”. hibernate二级缓存中的缓存对象可以被整个应用的Session对象共享,即使关闭当前Session对象,新建的Session对象仍可使用.使用Hibernate的二级缓存之后查询数据,Session对象会首先在以及缓存中查找有无缓存数据被命中.如果没有,则查找二级缓存.如果有,则直…
Hibernate二级缓存介绍 前面我们已经讲解过了一级缓存,一级缓存也就是Session缓存,只在Session的范围内有效-作用时间就在Session的作用域中,范围比较小 Hibernate为我们提供了二级缓存功能:二级缓存是基于应用程序的缓存,所有的Session都可以使用 Hibernate提供的二级缓存有默认的实现,且是一种可插配的缓存框架!如果用户想用二级缓存,只需要在hibernate.cfg.xml中配置即可: 不想用,直接移除,不影响代码. 如果用户觉得hibernate提供…
在WinForm系统中遇到了个问题,Form1是查询窗口,根据条件查询出所有数据,双击列表后创建弹出Form2窗口编辑单个记录,但编辑后保存后,在Form2中查询到的还是旧的数据,实际数据库中已经更新了,怀疑是4.2中加了查询缓存功能. 用ILSpy查看EntityFramework程序集,发现 System.Data.Entity.DbExtensions有个AsNoTracking的扩展方法,试了一下果然解决了.比如这样使用: var people = context.People.Wher…
1.可以重载方法进行配置文件的指定 sessionFactory = new AnnotationConfiguration().configure("hibernate.xml").buildSessionFactory(); 这样读取到的就是hibernate.xml 但一般不建议修改 getcurrentsession 指的是上下文如果没有提交 就不会创建新的session opensession 永远打开新的session 用于鉴定事务边界 比如加入日志操作等 事务:要么同时完…
Sessionclear 否则session缓存里越来越多 Java有内存泄露吗? 在语法中没有(垃圾自动回收) 但是在实际中会有 比如读文件没有关什么的 1+N问题 解决方法:把fetch设置为lazy 什么时候就为空 Bachsize 只是缓解 使用joinfetch Category package com.bjsxt.hibernate; import javax.persistence.Entity; import javax.persistence.GeneratedValue; i…
1.save 一对多双向 package com.bjsxt.hibernate; import java.util.HashSet; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persis…
为什么取1248 二进制 CRUD 移位效率高 在并发和效率选择一个平衡点 一般不会考虑幻读 因为我们不会再一个事务里查询两次,(只能设置为seralizable) 悲观锁和乐观锁的前提是read-uncommitted 在数据库中 默认是repeatable read 悲观锁是想着总有人要更改 所以使用数据库的锁 乐观锁是在程序级别的 设置一个版本号 如果前后不一致就进行自己的操作 例子 悲观所 Acocount package com.bjsxt.hibernate; import java…