`

Hibernate学习之一级缓存

阅读更多

为什么需要缓存:
当我们去查询对象的时候,首先到一级缓存去取数据,如果有,则不到数据库中取,如果没有则到数据库中取,同时在一级缓存中放入对象.
缓存的作用主要用来提高性能,可以简单的理解成一个Map;使用缓存涉及到三个操作:把数据放入缓存、从缓存中获取数据、删除缓存中的无效数据。

一级缓存的细节

什么操作会向一级缓存放入数据:
save,update,saveOrUpdate,load,get,list,iterate,lock
save 案例:
//添加一个学生
Student student=new Student();
student.setName("小东");
s.save(student);//放入一级缓存           
//我马上查询
Student stu2=(Student) s.get(Student.class, student.getId()); //select
System.out.println("你刚刚加入的学生名字是"+stu2.getName());



什么操作会从一级缓存取数据:
get / load
get / load 会首先从一级缓存中取,如没有.再有不同的操作[get 会立即向数据库发请求,而load 会返回一个代理对象,直到用户真的去使用数据,才会向数据库发请求]
list 会不会从session缓存取数据?
案例:
//查询45号学生
Student stu=(Student) s.get(Student.class, 45);
System.out.println("|||||||||||||||||||");
String hql="from Student where id=45";
Student stu2=(Student) s.createQuery(hql).uniqueResult();
System.out.println(stu2.getName());
从上面的案例,我看出 query.list() query.uniueResut() 不会从一级缓取数据! 但是query.list 或者query.uniqueRestu() 会向一级缓存放数据的.

一级缓存不需要配置,就可以使用,它本身没有保护机制,不能控制缓存的数量,所以要注意大批量操作数据时可能造成内存溢出,所以我们程序员要考虑这个问题,我们可以通过 evict 或者 clear来清除session缓存中对象.
evict 是清除一个对象,clear是清除所有的sesion缓存对象

session级缓存中对象的生命周期, 当session关闭后,就自动销毁.

HashMap 来模拟一个Session缓存,加深对缓存的深入:

package com.cz.cache;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MyCache {
	
	//使用map来模拟缓存
	static Map<Integer,Student> maps=new HashMap<Integer,Student>();
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		getStudent(1);
		getStudent(1);
		getStudent(1);
		getStudent(4);
		getStudent(4);	
		
	}
	
	public static Student getStudent(Integer id){  //s.get()
				
		//先到缓存去
		if(maps.containsKey(id)){
			//在缓存有
			System.out.println("从缓存取出");
			return maps.get(id);
		}else{
			System.out.println("从数据库中取");
			//到数据库取
			Student stu=MyDB.getStudentFromDB(id);
			//放入缓存
			maps.put(id, stu);
			return stu;
		}	
		
	}

}

//我的数据库
class MyDB{
	
	static List<Student> lists=new  ArrayList<Student>();
	
	//初始化数据库,假设有三个学生
	static{
		Student s1=new Student();
		s1.setId(1);
		s1.setName("aaa");
		Student s2=new Student();
		s2.setId(2);
		s2.setName("bbb");
		Student s3=new Student();
		s3.setId(3);
		s3.setName("ccc");
		lists.add(s1);
		lists.add(s2);
		lists.add(s3);
		
	}
	
	public static Student getStudentFromDB(Integer id){
		for(Student s: lists){
			if(s.getId().equals(id)){
				return s;
			}
		}
		return null;// 在数据库中没有.
		
	}
}

class Student{
	private Integer id;
	private String name;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

 

从控制台输出:
从数据库中取
从缓存取出
从缓存取出
从数据库中取
从缓存取出

分享到:
评论

相关推荐

    Hibernat一级缓存(源码)

    Hibernate 是一个流行的 Java ORM(对象关系映射)框架,它允许开发者使用面向对象的方式来操作数据库。...提供的 "student" 文件可能包含了关于 Hibernate 一级缓存实现的示例代码,可以进一步帮助理解和学习。

    day37 05-HIbernate二级缓存:一级缓存更新同步到二级缓存及二级缓存配置文件

    一级缓存是Hibernate默认提供的缓存,每个SessionFactory实例都有一个一级缓存。当对象被加载到内存中时,它们会被存储在一级缓存中。一级缓存是事务级的,意味着它只存在于当前事务内,一旦事务提交或回滚,一级...

    Hibernate性能优化:一级缓存

    总之,Hibernate的一级缓存是提高应用程序性能的关键因素之一。理解其工作原理并采取合适的优化措施,不仅能够减少数据库的负载,还能显著提升应用的整体响应速度。通过学习和实践,我们可以更好地驾驭这个强大的...

    hibernate二级缓存实例

    一级缓存是Session级别的,每个Session都有自己的一级缓存,用于存储当前Session操作的对象。而二级缓存则是SessionFactory级别的,它跨越了多个Session,是全局共享的,可以被多个并发的Session共同使用。 二级...

    hibernate二级缓存java包下载

    - 一级缓存:每个 Hibernate Session 对象都有一个一级缓存,它是默认开启的。当对象被加载到 Session 中,它们会被存储在一级缓存中,直到 Session 被关闭。一级缓存是事务范围的,只对当前 Session 可见。 - 二...

    hibernate二级缓存示例源码

    Hibernate的一级缓存是Session级别的,它自动管理对象的状态,提供瞬时、持久化和脱管状态之间的转换。然而,一级缓存的范围有限,当Session关闭时,其中的数据会被清除。为了解决这个问题,Hibernate引入了二级缓存...

    Hibernate-二级缓存总结 开发技术 - Java.zip

    一级缓存是Hibernate内置的Session缓存,每个Session都有自己的缓存,用于存储实体对象,它可以避免频繁地与数据库进行交互,提高性能。然而,一级缓存的作用范围仅限于单个Session,当Session关闭时,其中的数据就...

    Hibernate二级缓存+分页功能

    Hibernate一级缓存是指Session级别的缓存,它是默认开启的,每个Session都会维护一个对象缓存,用来存放该Session加载的实体对象。一级缓存的生命周期与Session相同,当Session关闭时,一级缓存中的数据也会被清除。...

    Spring4+Hibernate4二级缓存实例源码

    在Hibernate中,一级缓存是每个Session级别的,它存储了当前Session中所有持久化对象的副本,当Session关闭时,一级缓存中的数据会被清除。而二级缓存是SessionFactory级别的,它可以跨Session共享,即使Session关闭...

    hibernate二级缓存 SSH

    在Hibernate中,一级缓存是指SessionFactory级别的缓存,每个Session都会有自己的缓存,用于存储最近访问过的实体。而二级缓存则是在多个Session之间共享的数据缓存,它通常由第三方插件如Ehcache或Infinispan提供。...

    Hibernate_二级缓存 实验心得,手册

    与一级缓存不同的是,一级缓存默认为每个`Session`开启,用于存储当前`Session`内的实体状态。而二级缓存则是在`SessionFactory`级别提供的缓存机制,它可以跨越多个`Session`和事务,是一种持久化的缓存策略。 ###...

    hibernate二级缓存

    一级缓存(First Level Cache)是Hibernate内置的,每个Session都有一个独立的一级缓存。当我们在Session中进行对象的CRUD操作时,这些对象会被存储在一级缓存中。一级缓存是事务级别的,即在一个事务中,所有对同一...

    Hibernate二级缓存

    Hibernate缓存主要分为一级缓存和二级缓存: 1. **一级缓存(Session级别)**:每个Hibernate Session都拥有自己的缓存,也称为事务级缓存。当对象被持久化时,会自动放入一级缓存,同一会话内多次查询相同对象只会...

    Hibernate教程25_Hibernate缓存

    1. **一级缓存**:Hibernate的一级缓存是每个Session内置的,默认开启。当对象被加载到Session时,它们会自动存储在一级缓存中。这样,对同一Session内的相同对象的多次读取就可以直接从内存中获取,避免了重复的...

    hibernate学习资料大全

    Hibernate 提供了第一级缓存和第二级缓存,以及查询缓存,能够提高数据访问速度。学习如何配置和使用缓存,可以有效提升应用性能。 9. **延迟加载和懒加载**: 延迟加载(Lazy Loading)是Hibernate的一项重要...

    Hibernate4二级缓存Ehcache案例

    一级缓存是Hibernate Session级别的缓存,每个Session内部都有一个一级缓存,用于存储最近操作的对象。而二级缓存则是一个SessionFactory级别的全局缓存,它可以跨多个Session共享数据,提高了数据读取的速度和效率...

    Hibernate二级缓存实例.rar

    首先,我们需要了解什么是Hibernate的一级缓存和二级缓存。一级缓存是SessionFactory级别的,每个Session都有一个一级缓存,它存储了当前Session中的所有持久化对象。当我们在Session中进行CRUD(创建、读取、更新、...

    day37 07-Hibernate二级缓存:查询缓存

    在Hibernate中,缓存分为一级缓存和二级缓存。一级缓存是SessionFactory级别的,每个Session在操作数据时,都会将实体对象放入一级缓存,它是线程安全的,但生命周期较短,随着Session关闭,一级缓存中的数据也会被...

    41_传智播客hibernate教程_hibernate二级缓存的扩充细节.rar

    一级缓存是SessionFactory级别的,每个Session内部都有一个一级缓存,它是事务性的,即在同一个Session内的所有操作都会共享同一份缓存,一旦事务提交,这些数据就会被持久化到数据库。然而,一级缓存仅限于单个...

    Hibernate学习笔记和资料

    hibernate概述,hibernate入门Demo,hibernate配置文件详解(全局配置,实体类映射配置),配置实体规则,核心API详解(Configuration,sessionFactory,session,Transaction),...查询的优化,一级缓存,二级缓存,批量查询,注解方式

Global site tag (gtag.js) - Google Analytics