Session缓存

Hibernate的一级缓存是由Session提供的,因此它存在于Session的整个生命周期中,当程序调用save()/update()/saveOrupdate()/get()等及查询接口方法list()/iterator()方法时候,如果session中不存在该对象,那么会先将本次的对象存储到一级缓存中便于以后使用,当Session关闭时同时清空一级缓存数据。clear()/evict();Session的缓存可以减少访问数据库的次数,进而提高效率。保证缓存中的对象与数据库的记录保持同步,当缓存的对象改变后,session不会立即执行sql,而是将多个sql语句合并为一条sql进行执行,提高效率。当用户需要对指定的对象进行修改的时候,如果对于同一个属性修改了多次,其实hibernate的session缓存并不是执行多个update语句,而是以最后一个更新为准而发送一条更新的sql。

session.get()与session.load()方法

get()和load()方法先将获取的对象存储到一级缓存,当再次加载同一个持久化对象的时候先检测一级缓存中是否有该对象,如果有直接获取,不会发送SQL语句,否则才发送SQL

public void cache(){
Session session = SessionUtils.getCurrentSession();
session.beginTransaction();
Query query = null;
DataType dataType = null;
DataType dataType1 = null;
try {
// 获取要修改的对象
dataType = (DataType) session.get(DataType.class, new Long(1));
// session.evict(dataType);和session.clear();方法会清理缓存
dataType1 = (DataType) session.get(DataType.class, new Long(1));
System.out.println(dataType == dataType1);
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}

get()如果没有找到持久化类返回null,有可能导致空指针异常。load()如果没有找到持久化类直接抛出异常。get()是直接加载数据,load()是延迟加载,当使用被加载数据的时候才发送SQL。Hibernate对于load()认为数据库一定存在,因此可以放心的使用代理进行延迟加载,如果使用中发现了问题,那么只能抛出异常。而对于get方法一定要获取真实的数据,否则返回null。

Query对象实例中的list()和iterator方法

List()查询出来的结果会被缓存起来,那么当iterator()再查看的时候会先发送查询id的SQL,但是查询实体的SQL不会发出,因为它首先回去一级缓存中获取已经缓存的数据。

Iterator()方法加载的所有的持久化类对象要进行批处理修改的时候,每一个对象都要先缓存再修改,因此在循环中需要释放一级缓存中的内存占用,避免内存溢出。

public void cache(){
Session session = SessionUtils.getCurrentSession();
session.beginTransaction();
Query query = null;
try {
query = session.createQuery("from DataType");
List list = query.list();
System.out.println(list);
// session.clear();
Iterator<DataType> it = query.iterate();
while(it.hasNext()){
System.out.println(it.next());
}
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}
public void cache(){
Session session = SessionUtils.getCurrentSession();
session.beginTransaction();
Query query = null;
try {
query = session.createQuery("from DataType");
Iterator<DataType> it = query.iterate();
while(it.hasNext()){
DataType dataType = it.next();
dataType.setVip('K');
session.flush();
session.clear();
}
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}

list()直接一次性获取到所有持久化类的对象  iterator()先获取的是所有的数据的id值。当真正的遍历使用数据的  时候再发送select语句。因此该方法一定要处于session会话中。 list发送的查询语句只有1条。Iterator发送多条查询语句,因此iterator的效率低下。

list()如果表中有少量条数据,iterator()如果表中有N W条数据

hibernate Session一级缓存 应该注意的地方的更多相关文章

  1. hibernate(二)一级缓存和三种状态解析

    序言 前一篇文章知道了什么是hibernate,并且创建了第一个hibernate工程,今天就来先谈谈hibernate的一级缓存和它的三种状态,先要对着两个有一个深刻的了解,才能对后面我要讲解的一对 ...

  2. Hibernate 的一级缓存和二级缓存总结

    缓存:缓存是什么,解决什么问题? 位于速度相差较大的两种硬件/软件之间的,用于协调两者数据传输速度差异的结构,均可称之为缓存Cache.缓存目的:让数据更接近于应用程序,协调速度不匹配,使访问速度更快 ...

  3. Hibernate的一级缓存

    Hibernate的一级缓存 什么是缓存:缓存将数据库/硬盘上文件中数据,放入到缓存中(就是内存中一块空间).当再次使用的使用,可以直接从内存中获取 缓存的好处:提升程序运行的效率.缓存技术是Hibe ...

  4. Hibernate中一级缓存和二级缓存使用详解

    一.一级缓存二级缓存的概念解释 (1)一级缓存就是Session级别的缓存,一个Session做了一个查询操作,它会把这个操作的结果放在一级缓存中,如果短时间内这个 session(一定要同一个ses ...

  5. hibernate学习(四)hibernate的一级缓存&快照

    缓存:提高效率 硬件的 CPU缓存   硬盘缓存   内存 软件的  io流缓存 hibernate  的一级缓存   也是为了操作数据库的效率. 证明一级缓存在  : Person p=sessio ...

  6. Hibernate之一级缓存和二级缓存

    1:Hibernate的一级缓存: 1.1:使用一级缓存的目的是为了减少对数据库的访问次数,从而提升hibernate的执行效率:(当执行一次查询操作的时候,执行第二次查询操作,先检查缓存中是否有数据 ...

  7. Hibernate中一级缓存和二级缓存

    缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能.缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事 ...

  8. Hibernate 之 一级缓存

    本篇文章主要是总结Hibernate中关于缓存的相关内容. 先来看看什么是缓存,我们这里所说的缓存主要是指应用程序与物流数据源之间(例如硬盘),用于存放临时数据的内存区域,这样做的目的是为了减少应用程 ...

  9. (转)Hibernate的一级缓存

    http://blog.csdn.net/yerenyuan_pku/article/details/70148567 Hibernate的一级缓存 Hibernate的一级缓存就是指Session缓 ...

随机推荐

  1. rundll32.exe的相关使用语句

    命令列: rundll32.exe shell32.dll,Control_RunDLL 功能: 显示控制面板 命令列: rundll32.exe shell32.dll,Control_RunDLL ...

  2. C++之类静态成员变量和静态成员函数

    1.静态成员变量必须在类外初始化 2.静态成员变量在类中不占内存字节: 3.静态成员变量,被所有的类对象共 享 class G {public: static int a; //静态成员变量 int ...

  3. 使用iozone测试磁盘性能(测试文件读写)

    IOzone是一个文件系统测试基准工具.可以测试不同的操作系统中文件系统的读写性能.可以通过 write, re-write, read, re-read, random read, random w ...

  4. http://blog.csdn.net/tkwxty/article/details/34474501

    http://blog.csdn.net/tkwxty/article/details/34474501

  5. Kafka查看偏移量报错:WARN WARNING: ConsumerOffsetChecker is deprecated and will be dropped in releases following 0.9.0. Use ConsumerGroupCommand instead.

    Kafka0.9版本后,命令ConsumerOffsetChecker已弃用,用新的命令来查. // 列表 bin/kafka-consumer-groups.sh --zookeeper local ...

  6. 终端内容输出的同时保存到文件 tee

    突然有这个需求,一查用tee就能实现 用法:tee [选项]... [文件]... 将标准输入复制到每个指定文件,并显示到标准输出. -a, --append 内容追加到给定的文件而非覆盖 -i, - ...

  7. asyncio NetMQ 解决方案编译问题

    程序集代码 (原) <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <VersionPrefix& ...

  8. Node.js 使用爬虫批量下载网络图片到本地

    图片网站往往广告众多,用Node.js写个爬虫下载图片,代码不长,省事不少,比手动一张张保存简直是天与地的区别.以前用Java也做过远程图片下载,但Node.js的下载速度更让人咂舌,这也是非阻塞式变 ...

  9. jquery.cookie.js操作cookie实现“记住密码”,很简单很强大

    //初始化页面时验证是否记住了密码 $(document).ready(function() { if ($.cookie("rmbUser") == "true&quo ...

  10. Python学习笔记(七)函数的使用

    python中的函数使用较简单,这里列出值得注意的几点:   内嵌函数   例如: # coding: utf-8 def foo(): def bar(): print 'bar() called. ...