本文记录:Hibernate中一级缓存的特点。
一级缓存的细节什么操作会向一
1.级缓存放入数据
save,update,saveOrUpdate,load,get,list,iterate,lock
2.什么操作会从一级缓存取数据。
get / load / list
get / load 会首先从一级缓存中取,如没有,再有不同的操作[get 会立即向数据库发请求,而load 会返回一个代理对象,直到用户真的去使用数据,才会向数据库发请求。
?list 会不会从session缓存取数据?
3.一级缓存不需要配置,就可以使用,它本身没有保护机制,所以我们程序员要考虑这个问题,我们可以同 evict 或者 clear来清除session缓存中对象。
evict 是清除一个对象,clear是清除所有的sesion缓存对象
4.session级缓存中对象的生命周期, 当session关闭后,就自动销毁.
5.自己用HashMap来模拟一个Session缓存,加深对缓存的深入。
package dome; 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(1); getStudent(3); getStudent(3); } 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; } }