Hibernate——一级缓存
来源:互联网 发布:蔡振南心事谁人知简谱 编辑:程序博客网 时间:2024/05/29 10:59
一级缓存是由Session提供的,所以它只存在于Session的生命周期中,当程序调用save(),update(),saveorupdate()等方法以及调用查询接口list,filter,iterate时,如果session缓存中还不存在相应的对象,Hibernate会把该对象加入到一级缓存中,当Session关闭的时候该Session所管理的一级缓存也会立即被清除。当程序调用get(),load(),iterate(查询实体对象才支持一级缓存,查询普通属性则不支持一级缓存)时,Hibernate会先到缓存中去拿,如果缓存中已经存在目标对象,则直接拿来而不再查询数据库,否则,必须发出查询语句到数据库中查。
private Integer id;
private String name;
//一系列的setter.getter方法
}
2.映射文件:
<id name="id" length="4">
<generatorclass="native"></generator>
</id>
<propertyname="name"length="10"></property>
</class>
public staticvoid main(String[] args) {
Session session = null;
Transaction t = null;
try {
session = HibernateUtils.getSession();
t = session.beginTransaction();
/**
* 在同一个session中发出两次load查询
*/
/* //如果前面没有用session操作过此student对象,在这里会发出sql语句.
Student student = (Student)session.load(Student.class, 1);
System.out.println("student.name=" + student.getName());
//不会发出sql,因为load使用一级缓存
student = (Student)session.load(Student.class, 1);
System.out.println("student.name=" + student.getName());*/
/**
* 在同一个session中发出两次get查询
*/
/* Student student = (Student)session.get(Student.class, 1);
System.out.println("student.name=" + student.getName());
//不会发出sql,因为get也使用一级缓存
student = (Student)session.get(Student.class, 1);
System.out.println("student.name=" + student.getName());*/
/**
* 在同一个session中发出两次iterate查询实体对象
*/
/* Student student = (Student)session.createQuery("from Student s where s.id=1").iterate().next();
System.out.println("student.name=" + student.getName());
//会发出查询id的sql,不会发出查询实体对象的sql,因为iterate在查询实体对象时也使用缓存
student = (Student)session.createQuery("from Student s where s.id=1").iterate().next();
System.out.println("student.name=" + student.getName());*/
/**
* 在同一个session中发出两次iterate查询实体对象
*/
/* //发出sql直接插name,不再插id
//select student0_.name as col_0_0_ from sxt_hibernate_student student0_ where student0_.id=1
String name = (String)session.createQuery("select s.name from Student s where s.id=1").iterate().next();
System.out.println("student.name=" + name);
//iterate查询普通属性,一级缓存不会缓存,所以发出sql
//由此可见,一级缓存是缓存实体对象的
name = (String)session.createQuery("select s.name from Student s where s.id=1").iterate().next();
System.out.println("student.name=" + name);*/
/**
* 在同一个session中先save,在发出load查询save过的数据
*/
/* Student stu = new Student();
stu.setName("吴奇隆");
Serializable id = session.save(stu);//主键生成方式采用native,是个序列化的id.
//不会发出sql,因为save是使用缓存的.save之后,会把对象放到一级缓存中.
//再load时,直接到一级缓存中去拿就可以了.
Student student = (Student)session.load(Student.class, id);
System.out.println("student.name=" + student.getName());*/
/**
* 向数据库中批量加入5000条数据
*/
/* for (int i=0; i<5000; i++) {
Student student = new Student();
student.setName("stu_" + i);
session.save(student);
//每20条数据就强制session将数据持久化
//同时清除缓存,避免大量数据造成内存溢出
if ( i % 30 == 0) {
session.flush();
session.clear();
}
}*/
/**
* 在数据库中一次性更新大批量数据
*/
/* Iterator<Student> students=session.createQuery("from Student s where s.id>100").iterate();
while(students.hasNext()){
Student stu =(Student)students.next();
stu.setName("n_"+stu.getName());
//将本批插入的对象立即写入数据库并释放内存
session.flush();
session.clear();
}*/
/**
* Hibernate并不适合处理大批量的数据,通常我们都跳过Hibernate API,而直接采用JDBC API来做.
*/
/* Connection conn =session.connection();
PreparedStatement pstmt = conn.prepareStatement("update sxt_hibernate_student set name='s'||substr(name,4,8) "+"where id >100");
pstmt.executeUpdate();*/
/**
* 其实批处理大量数据更新最好的解决方法就是用创建存储过程,直接利用底层数据库.这样性能最好.
*/
/*
*create or replace procedure StudentUpdate(s_id in number) as
*begin
*update sxt_hibernate_student set name='n_'||name where id>s_id;
*end;
*/
Connection conn=session.connection();
String str="{call StudentUpdate(?)}";
CallableStatement cstmt= conn.prepareCall(str);
cstmt.setInt(1,100);
cstmt.executeUpdate();
t.commit();
} catch (Exception e) {
e.printStackTrace();
t.rollback();
} finally {
HibernateUtils.closeSession(session);
}
/**
* 开启两个session中发出load查询
*/
/* try{
session=HibernateUtils.getSession();
t=session.beginTransaction();
Student student = (Student)session.load(Student.class, 1);
System.out.println("student.name=" + student.getName());
}catch(Exception e){
e.printStackTrace();
t.rollback();
}finally{
HibernateUtils.closeSession(session);
}
try{
session=HibernateUtils.getSession();
t=session.beginTransaction();
//会发出查询语句,因为一级缓存时和session绑定的,每个session都有自己的一级缓存,不同session间不能共享一级缓存.
//上一个session已经关闭了,所以此处还要发出查询语句.
Student student = (Student)session.load(Student.class, 1);
System.out.println("student.name=" + student.getName());
}catch(Exception e){
e.printStackTrace();
t.rollback();
}finally{
HibernateUtils.closeSession(session);
}*/
}
原文出自:http://yangfei520.blog.51cto.com/1041581/278299
- Hibernate——一级缓存
- hibernate —— 一级缓存和二级缓存
- Hibernate一级缓存——Session
- Hibernate——一级缓存__二级缓存__查询缓存
- Hibernate学习笔记(三) — Hibernate 的一级缓存意义
- Hibernate一级缓存【Hibernate】
- 【JavaEE—Hibernate】一级缓存以及事务操作
- Hibernate复习笔记(3)——Session缓存(Hibernate一级缓存)详解
- Hibernate的一级缓存
- hibernate一级缓存(转)
- Hibernate一级缓存
- Hibernate一级缓存详解
- Hibernate一级缓存 & 二级缓存
- hibernate一级缓存
- Hibernate---->一级缓存
- Hibernate一级缓存,二级缓存
- Hibernate 之 一级缓存
- Hibernate一级缓存
- 【你想在家里控制办公室的电脑办公吗?】TeamViewer远程工具体验
- 一个添加启动项的bat
- java nio
- 【面向对象课程项目:纸牌】Java实例学习(一):优秀源码的分析
- 剖析Linux系统启动过程
- Hibernate——一级缓存
- 认识 java JVM虚拟机选项 Xms Xmx PermSize MaxPermSize 区别
- C# 调用C++DLL传递的bool型,返回混乱
- 编程读取文档Doc,Docx,Pdf的内容
- AJAX
- jquery插件tablesorter自动排序
- 深入理解Linux启动过程
- 用筛选法求100以内的素数
- 职场打拼不能不知道的反话从