Session缓存:
当Session的save()方法持久化一个Customer对象时,Customer对象被加入到Session的缓存中,以后即使应用程序中的引用变量不再引用Customer对象,只要Session的缓存还没有被清空,Customer对象仍然处于生命周期中。
Session会在下面的时间点清理缓存:
(1).当应用程序调用org.hibernate.Transaction的commit()方法的时候,commit()方法先清理缓存,然后再向数据库提交事务。
(2).当应用程序显式调用Session的flush()方法的时候。
tx = session.beginTransaction(); Customer c1=new Customer("zhangsan",new HashSet()); //Customer对象被持久化,并且加入到Session的缓存中 session.save(c1); Long id=c1.getId(); //c1变量不再引用Customer对象 c1=null; //从Session缓存中读取Customer对象,使c2变量引用Customer对象 Customer c2=(Customer)session.load(Customer.class,id); tx.commit(); //关闭Session,清空缓存 session.close(); //访问Customer对象 System.out.println(c2.getName()); // c2变量不再引用Customer对象,此时Customer对象结束生命周期。 c2=null;
当Session的load()方法试图从数据库中加载一个Customer对象时,Session先判断缓存中是否已经存在这个Customer对象,如果存在,就不需要再到数据库中检索。
tx = session.beginTransaction(); //第一次load会检索数据库,得到一个持久化的customer对象 Customer c1=(Customer)session.load(Customer.class,new Long(1)); //第二次load,检查session缓存中有该对象,直接返回 Customer c2=(Customer)session.load(Customer.class,new Long(1)); System.out.println(c1==c2); // true or false ?? tx.commit(); session.close();
当缓存中持久化对象的状态发生了变化,Session并不会立即执行相关的SQL语句,这使得Session能够把几条相关的SQL语句合并为一条SQL语句,以便减少访问数据库的次数,从而提高应用程序的性能。
//以下程序代码对Customer的name属性修改了两次: tx = session.beginTransaction(); Customer customer=(Customer)session.load(Customer.class, new Long(1)); customer.setName("Jack"); customer.setName("Mike"); tx.commit(); /* 当Session清理缓存时,只需执行一条update语句: update CUSTOMERS set NAME= 'Mike' ..... where ID=1; */
总结Session缓存的作用:
(1)减少访问数据库的频率。应用程序从内存中读取持久化对象的速度显然比到数据库中查询数据的速度快多了,因此Session的缓存可以提高数据访问的性能。
(2)保证缓存中的对象与数据库中的相关记录保持同步。
在Hibernate中Java对象的状态:
临时状态(transient):刚刚用new语句创建,还没有被持久化,不处于Session的缓存中。处于临时状态的Java对象被称为临时对象。
持久化状态(persistent):已经被持久化,加入到Session的缓存中。处于持久化状态的Java对象被称为持久化对象。
游离状态(detached):已经被持久化,但不再处于Session的缓存中。处于游离状态的Java对象被称为游离对象。
对象状态转换图:
<!--[if gte mso 9]><xml><w:WordDocument><w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel><w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery><w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery><w:DocumentKind>DocumentNotSpecified</w:DocumentKind><w:DrawingGridVerticalSpacing>7.8</w:DrawingGridVerticalSpacing><w:View>Normal</w:View><w:Compatibility></w:Compatibility><w:Zoom>0</w:Zoom></w:WordDocument></xml><![endif]-->
<!--[if gte mso 9]><xml><w:WordDocument><w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel><w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery><w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery><w:DocumentKind>DocumentNotSpecified</w:DocumentKind><w:DrawingGridVerticalSpacing>7.8</w:DrawingGridVerticalSpacing><w:View>Normal</w:View><w:Compatibility></w:Compatibility><w:Zoom>0</w:Zoom></w:WordDocument></xml><![endif]-->
Customer对象的状态转换过程(第一段代码)
Session的update()方法完成以下操作:
(1)把Customer对象重新加入到Session缓存中,使它变为持久化对象。
(2)计划执行一个update语句。值得注意的是,Session只有在清理缓存的时候才会执行update语句,并且在执行时才会把Customer对象当前的属性值组装到update语句中。因此,即使程序中多次修改了Customer对象的属性,在清理缓存时只会执行一次update语句。
Customer customer=new Customer(); customer.setName("Tom"); Session session1=sessionFactory.openSession(); Transaction tx1 = session1.beginTransaction(); session1.save(customer); tx1.commit(); session1.close(); //此时Customer对象变为游离对象 Session session2=sessionFactory.openSession(); Transaction tx2 = session2.beginTransaction(); customer.setName("zhangsan"); //在和session2关联之前修改Customer对象的属性 session2.update(customer); //此时Customer对象变为持久化对象 customer.setName("lisi"); //在和session2关联之后修改Customer对象的属性 tx2.commit(); session2.close();
客户层与业务逻辑层之间传递临时对象和游离对象的过程
相关推荐
本章站在持久化层的角度,Java对象在生命周期中可处于临时状态、持久化状态、删除状态和游离状态。处于持久化状态的Java对象位于一个Session实例的缓存中,Session能根据这个对象的属性变化来同步更新数据库。 8.1 ...
本章站在持久化层的角度,Java对象在生命周期中可处于临时状态、持久化状态、删除状态和游离状态。处于持久化状态的Java对象位于一个Session实例的缓存中,Session能根据这个对象的属性变化来同步更新数据库。 8.1 ...
### 活动目录和域的组建 #### 项目背景及目标 本次项目的主要目标是构建一个基于活动目录(Active Directory)的网络环境,并通过不同的角色分工,完成多个子任务,包括域控制器的创建、成员服务器的搭建以及跨域...
使用mindmaster打开
通过`session.setAttribute(String name, Object value)`可以将对象存储在Session中,`session.getAttribute(String name)`用于获取数据。当不再需要Session时,调用`session.invalidate()`注销Session。 - **生命...
【Session和Cookie】是Web开发中的两种重要技术,用于在客户端和服务器之间管理用户状态。它们主要用于解决HTTP协议无状态的特性,即每次请求都是独立的,无法记住用户信息。 **1. Session** Session是在服务器端...
在Web开发中,Session和Cookie是两种常见的用户状态管理技术,它们主要用来跟踪用户的会话信息,比如购物车内容、登录状态等。了解它们的区别对于优化网站性能和提升用户体验至关重要。 1. **存储位置** - Cookie:...
在Web开发中,Cookie、Session和JSP是三个至关重要的概念。它们共同构成了用户身份验证、状态管理和动态页面生成的基础。下面将详细讲解这三个概念及其相互关系。 **Cookie** Cookie是一种在客户端和服务器之间...
持久化层作为其中的一层,负责数据的存取,为业务逻辑提供面向对象的API。 2. **软件的模型** 软件模型包括概念模型、关系数据模型和域模型。概念模型描述问题域的实体和关系,关系数据模型基于此建立数据库的静态...
项目三 活动目录和域的组建.docx
在软件开发过程中,敏捷开发是一种越来越受到重视的方法论,它强调快速迭代、适应变化和团队协作。本篇文章将深入探讨敏捷开发中的一个关键技巧——如何有效地将数据库访问、用户界面(UI)和领域逻辑(Domain Logic...
### 项目三 活动目录和域的组建 #### 一、项目背景与目标 随着公司的快速发展,原有的基于工作组的局域网已无法满足日益增长的员工需求以及网络安全管理的需求。为了更好地进行网络资源的集中管理和提高安全性,...
### Word排版之公式编辑器和域的使用技巧 #### 公式编辑器的使用技巧 **公式编辑器**是一款由DesignScience公司开发的专业数学公式编辑工具,专门为Microsoft Word量身定制。它不仅可以帮助用户轻松地创建各种复杂...
4. 在持久层中,则依赖于 Hibernate 的对象化映射和数据库交互,处理 DAO 组件请求的数据,并返回处理结果。 Struts1 与 Struts2 的区别: 1. Action 类:Struts1 要求 Action 类继承一个抽象基类。Struts2 Action...
1.1 概念理解:活动目录是一种目录服务,它存储网络对象(如用户、组、计算机)的信息,并通过层次结构的域名系统(DNS)来组织这些对象。AD使得管理员可以方便地管理和控制网络资源,同时提供身份验证和授权功能。 ...
Cookie 和 Session 是两种常见的用户身份验证和会话管理机制,它们在Web开发中扮演着重要角色。理解它们的区别有助于优化应用程序的性能和安全性。 Cookie 是一种客户端存储机制,由服务器生成并在HTTP响应头中发送...
win2003 ad和域ppt 请大家快点来下载吧
在性能测试中,cookie 和 session 机制是两种常用的状态管理机制,它们之间存在着紧密的联系和区别。下面是对 cookie 和 session 机制的详细介绍: 一、cookie 机制 cookie 机制是一种在客户端保持状态的方案,它...