hibernate作为一种现在比较流行的轻量级的ORM框架,2003年开始在国内流行,到目前来说在做持久层上还是占有统治地位的。虽然说丰富灵活的HQL和面对对象的Criteria查询,把程序员从复杂繁琐的JDBC中解放了出来,但作为持久层的框架,它的性能才是最重要的核心问题。而性能的核心在于缓存,由于最近在学习这些,所以就把自己的学到的一点东西拿来与大家分享,希望能起到抛砖引玉的效果。
在说这些之前的先说说hibernate实体对象的三种状态:
1.Transient:所谓Transient就是说实体对象在内存中自有存在,与数据库中的记录无关。
2.Persient:Persient对象对应数据库中的一条记录,也可以这样理解,如果一个实体对象与某个session发生关联,并处于对应session的有效期内,那它就处于Persient状态。
3.Detached:所谓的Detached就是处于Persient状态的对象对应的session关闭之后的状态。
我们平时所说的PO(持久化对象)指的就是位于Persient状态的对象,而VO(值对象)就是指Transient和Detached状态的对象。
下面开始说CRUD保存:hibernate中保存的方法很多我主要说说下面几个:
1.save()方法,调用save方法时,首先会在session缓存中查找保存对象如果实体对象已经处于Persient状态,直接返回,否在实行sql操作,并将保存的实体对象加入session缓存(save方法不会把实体加入二级缓存的),最后对存在的级联关系进行递归处理。
2.saveOrUpdate()方法:和save方法一样首先在session缓存中查找,判断对象是否为为保存状态,如果对象处于Persient,不执行操作,处于Transient执行save操作,处于Detached调用save将对象与session重新关联。
这里要注意的是批量操作时要适时对session进行flush操作避免OutOfMenoryError.删除:删除我主要说批量删除,hibernate在进行批量删除前,首先必须将所有符合条件的数据加载到内存中(这是所有ORM框架必须面对的问题,这样主要是为了对目前的内部缓存和二级缓存中数据进行整理,以保存和数据库的一致性)这样就面对这如果操作数据量过大,也会出现OutOfMenoryError,所以推荐使用迭代删除。
修改:修改主要谈谈update方法,update和前面的save一样首先还是要进行在内部缓存中查找,要注意两点,1.Persient状态的实体对象调用update没有任何作用,update的SQL将在session.flush()方法中执行。
查询:查询是受缓存影响最大的,主要谈一下以下几种查询1.load和get:这两者的区别主要是load会在二级缓存中查找,而get在内部缓存中查找不到将跳过二级缓存直接进行sql操作。
2.createQuery()的list()和iterate()方法,list()实际上无法使用缓存的,他对缓存只写不读,而ierate则是首先查找所有符合条件的数据id(首先在本地缓存中查找)在执行相应的select获得对应记录,iterate方法的使用最好是查找的实体对象在缓存已经存在,否则查询性能较低,易产生N+1现象。
其实还有Query Cache但怕篇幅太长,让人烦所以就就此停笔,其实缓存是一个很深问题,也很值得研究。
分享到:
- 2008-04-22 16:19
- 浏览 1406
- 评论(2)
- 论坛回复 / 浏览 (1 / 2060)
- 查看更多
相关推荐
第一部分 从Hibernate和EJB 3.0开始 第1章 理解对象/关系持久化 1.1 什么是持久化 1.1.1 关系数据库 1.1.2 理解SQL 1.1.3 在Java中使用SQL 1.1.4 面向对象应用程序中的持久化 1.2 范式不...
入门级功能:包括属性(配置),JDBC模板(数据库CRUD),JPA(Hibernate数据库CRUD),Mybatis(数据库CRUD),Mybatis(Mybatis数据库CRUD),thymeleaf(模板解析),beetl(模板解析),freemarker (模板解析)...
Hibernate4(关系映射,事务,原理,性能和二级缓存,最佳实践) Hibernate4(基本开发,入门,配置,CRUD)
2.Hibernate的操作CRUD、 3.主键生成机制、 4.持久化对象的状态、 5.映射一对多关联关系、 6.深入session、 7.懒加载、 8.Hibernate检索策略(fetch抓取策略)、 9.二级缓存、 10.Hbernate的检索方式(HQL语句)
使用技术:Spring4.0.6+Hibernate4.3.5+Struts2.3.16+Jquery+Easyui 服务器:Tomcat7 数据库:Mysql5.1 前台: 商品分类显示,大类,小类 商品查询功能 公告显示 新闻动态显示 今日特价商品显示 热卖推荐商品显示...
第一天:Hibernate 的入门(Hibernate 的环境搭建、Hibernate 的API、Hibernate 的 CRUD) 第二天:Hibernate 的一级缓存、其他的 API 第三天:Hibernate 的一对多配置、Hibernate 的多对多的配置 第四天:Hibernate...
sqltoy-orm是比hibernate+myBatis(plus)更加贴合项目的orm框架(依赖spring),具有jpa式的对象CRUD的同时具有比myBatis(plus)更直观简洁性能强大的查询功能,越复杂优势越凸显。Java真正智慧的ORM框架,除具有JPA功能...
撑杆春天冬眠EhCache——缓存框架JSP前端技术: jQuery的引导程序UEditor——在线HTML编辑器模块介绍公共类设计Web.xml中配置Struts及初始化Spring容器,准备WEB-INF路径下applicationContex.xml文件作为Spring配置...
◆ 重点讨论为基于REST的应用程序创建和使用简单数据库以便缓存和同步结果 ◆ 介绍内容提供器、REST、并发和网络 ◆ 详解使用Hibernate创建REST风格的Web服务以及将其连接到Android ◆ 通过避免在Internet上执行CRUD...
1. 简介 2. 起步 2.1 下载并安装Grails 2.2 创建一个Grails应用 2.3 Hello World示例 2.4 使用IDE 2.5 规约配置 ...15. Grails和Hibernate 15.1 通过Hibernate注释进行映射 15.2 深入了解 16. 脚手架
Session接口 Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交 流,包含了很多常见的SQL语句。)。但需要注意的是Session对象是非线程安全的。同时 ,Hibernate的session不同于JSP应用中的...
CRUD 操作 一个 PostgreSQL 数据库; 请参阅下文以通过 Docker 运行一个 ArC,CDI 启发了零开销的依赖注入工具 高性能 Agroal 连接池 基于 Infinispan 的缓存 全部由 Narayana 交易经理安全协调 一步步 要求 要编译...
它可以像hibernate一样通过简单易用的API接口进行CRUD数据库操作,也可以像mybatis一样通过XML分离进行高效可配的操作;同时它可以混合两种调用方式,简单普遍的操作采用API,复杂的操作采用XML映射,集各家之所长。...
描述:它是一个员工管理系统,作为 Web 和休息服务暴露给用户,用户可以使用它执行基本的 crud 操作,还可以搜索使用字段过滤的员工。 此代码可用于了解如何使用 spring 模块创建具有客户端到后端的 Web 应用程序,...
由于J2EE的开源的框架中提供了MVC模式实现框架Struts、对象关系模型中的Hibernate 的框架及拥有事务管理和依赖注入的Spring。利用现存框架可以更快开发系统。所以选择Java技术作为blog 的开发工具。 为了增加系统的...
所有ORM具备3方面基本能力:映射技术、CRUD操作、缓存优化。每种编程语言都具有自己的ORM库,java 的Hibernate、IBATIS;C#的Grove LINQ; Python 的 SQLAlchemy 1、映射技术 面向对象是从软件工程的基本原则(如...
泛型封装dao、service、controller基类,包含分页,查询条件封装,从而达到快速crud操作(参考") 简易代码生成器,增加字段配置功能、生成页面功能,实现增删查改不需要写一句代码(参考) ehcache缓存 springmvc 整合...
该平台使用了maven作为项目管理,使用了web开发流行的框架便于学习使用,具体使用了spring、springmvc、spring ache (安全)shiro、hibernate、freemark等框架,为了统一页面风格使用DWZ作为页面富客户端的展示。...
│ 73-完成参数管理的crud和数据的导入-1.mp4 │ 74-从数据库中获取过滤器参数-1.mp4 │ 75-分析编码的流程-1.mp4 │ 76-创建job类和task类-1.mp4 │ 77-创建scheduleutilsv1-1.mp4 │ 78-创建任务调度工具类-1.mp4 ...
同时每个查询都可以针对batch、fetchSize、maxResult、缓存、级联操作类型等进行调整和开关,可以将性能调到最优。可在主流数据库之间任意切换 支持Oracle、MySQL、Postgres、MSSQL、GBase、SQLite、HSQL、Derby等...