Session.get/load的区别:
1.如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObejctNotFoundException。
2.Load方法可返回实体的代理类类型,而get方法永远直接返回实体类。
3.Load方法可以充分利用内部缓存和二级缓存中现有数据,而get方法则仅仅在内部缓存中进行数据查找,如没有发现对应数据,将越过二级缓存,直接调用SQL完成数据读取。
Session.find/iterate的区别:
find方法将执行Select SQL从数据库中获得所有符合条件的记录并构造相应的实体对象,实体对象构建完毕之后,就将其纳入缓存。它对缓存只写不读,因此无法利用缓存。
iterate 方法首先执行一条Select SQL以获得所有符合查询条件的数据id,随即,iterate方法首先在本地缓存中根据id查找对应的实体对象是否存在,如果缓存中已经存在对应的数 据,则直接以此数据对象作为查询结果,如果没有找到,再执行相应的Select语句获得对应的库表记录(iterate方法如果执行了数据库读取操作并构 建了完整的数据对象,也会将其查询结果纳入缓存)。
[实际的情况是,如果使用 了iterate方法返回Iterator类型的查询结果,那么你一旦关闭session,Iterator中的数据立即就会消失.而通过find得到的 List则不会如此,我想大部分人的使用习惯都是操作完成后立即关闭session,很多公司也强制要求这样做.
Iterator的另一个麻烦事是fail-fast,在多线程环境下,很容易产生.使用线程安全的List子类,则不会有这个问题]
Session.saveOrUpdate方法的执行步骤:
1.首先在Session内部缓存中进行查找,如果发现则直接返回。
2.执行实体类对应的Interceptor.isUnsaved方法(如果有的话),判断对象是否为未保存状态。
3.根据unsaved-value判断对象是否处于未保存状态。
4.如果对象未保存(Transient状态),则调用save方法保存对象。
5.如果对象为已保存(Detached状态),调用update方法将对象与Session重新关联。
Session.delete(E)
E 由持久状态/游离状态 -->>自由状态
Session.flush()
调用flush
1.直接调用Session.flush();
2.tx.commit();
//flush before commiting the transaction and closing the session
//Flushing is the process of synchronising the underlying persistent store with persistable state held in memory.
E1=Session.merge(E)
if E is transient instance,则insert数据库,E状态不变化,E1是一个持久化对象;
if E is detached instance,则重新load,变成persistent instance;
if E is persistent instance,则从缓存中选择;
// Copy the state of the given object onto the persistent object with the same identifier.
// If there is no persistent instance currently associated with the session, it will be loaded. Return the persistent instance.
// If the given instance is unsaved, save a copy of and return it as a newly persistent instance. The given instance does not become associated with the session.
// This operation cascades to associated instances if the association is mapped with cascade="merge".
Session.persist(E)
if E is transient instance,则类似save方法;
if E is detached instance,则抛出PersistentObjectException: detached entity passed to persist;
if E is persistent instance,则类似save方法;
Query Cache产生作用的情况:
1.完全相同的Select SQL重复执行。
2.在两次查询之间,此Select SQL对应的库表没有发生过改变。
Session.save方法的执行步骤:
1.在Session内部缓存中寻找待保存对象。内部缓存命中,则认为此数据已经保存(执行过insert操作),实体对象已经处于Persistent状态,直接返回。
2.如果实体类实现了lifecycle接口,则调用待保存对象的onSave方法。
3.如果实体类实现了validatable接口,则调用其validate()方法。
4.调用对应拦截器的Interceptor.onSave方法(如果有的话)。
5.构造Insert SQL,并加以执行。
6.记录插入成功,user.id属性被设定为insert操作返回的新记录id值。
7.将user对象放入内部缓存。
8.最后,如果存在级联关系,对级联关系进行递归处理。
Session.update方法的执行步骤:
1.根据待更新实体对象的Key,在当前session的内部缓存中进行查找,如果发现,则认为当前实体对象已经处于Persistent状态,返回。
2.初始化实体对象的状态信息(作为之后脏数据检查的依据),并将其纳入内部缓存。注意这里Session.update方法本身并没有发送Update SQL完成数据更新操作,Update SQL将在之后的Session.flush方法中执行, 根据id更新所有的字段,如update user set name=?, password=? where id=?。
分享到:
相关推荐
它规定了一组方法来创建、读取和更新Session数据。具体实现由各个Web应用服务器提供商提供,可能存在一定的差异。 ##### 3.2 控制Session的行为 WebLogic Server等服务器提供了丰富的配置选项来控制Session的行为...
session是服务器端存储用户状态的一种方法,它可以保存用户的信息,在多个页面之间保持会话状态。 首先,我们来看`getcode.php`,这个文件通常用于生成并显示验证码。在这个文件中,PHP会通过随机函数生成一个唯一...
Session共享库(session-share-libs)通常指的是用于在不同应用或者服务器之间共享用户会话状态的一组工具或服务。这种共享对于构建分布式系统、负载均衡环境以及多服务器协同工作的情况至关重要。下面将详细解释...
2. **自定义`Valve`组件**:另一种方法是编写一个自定义的`Valve`组件,该组件拦截每个请求,负责`session`的创建、读取、更新和删除操作,并通过`Jedis`客户端与`Redis`进行通信。 接下来,我们需要配置`Redis`以...
1. 配置Nginx:在Nginx的配置文件中,我们需要设置反向代理规则,将所有需要session共享的请求指向同一组后端服务器,并开启session亲和性(sticky session),确保用户的后续请求始终被发送到最初处理登录请求的...
集成Spring Session与Redis的过程大致分为以下几步: 1. **添加依赖**:首先,你需要在项目的Maven或Gradle配置文件中添加Spring Session和Redis的相关依赖。这些jar包可能包括`spring-session-data-redis`,`...
- **配置复制组**:在集群中,需要定义一个或多个复制组,每个组内的实例会互相复制session数据。这可以在WebLogic管理控制台中完成,或者通过WLST(WebLogic Scripting Tool)进行脚本配置。 - **WEBLOGIC.XML...
本篇文章将详细介绍如何在 Linux 环境下搭建基于 Apache 和 Tomcat 的集群负载均衡,并实现 session 复制,以确保在多台服务器之间能够无缝地进行会话共享。 #### 二、环境配置 在部署 Apache+Tomcat 集群之前,...
在Web后端开发中,会话(Session)跟踪技术是一种常用的方法,用于在客户端与服务器之间维护用户状态,尤其在用户登录和注销过程中扮演着重要角色。本文将深入探讨Session的工作原理、如何实现用户登录与注销,以及...
- 实现思路:通过`IsArray`函数判断session中的“UserCart”键对应的值是否为数组类型,如果是则返回true表示存在有效购物车,否则返回false。 3. **检查购物车是否为空 (CheckEmpty)** - 功能:检查购物车是否...
为了保证用户体验的连续性,Session复制技术用于在多个Tomcat实例之间共享用户会话状态。本文将详细介绍如何在Nginx和Tomcat集群中实现Session复制。 ### 一、测试环境搭建 1. **软件列表**: - Nginx - PCRE ...
在Nginx+Tomcat+Memcached的架构中,Memcached作为一个集中式的存储节点,负责保存所有Tomcat实例的session数据,确保在任何服务器之间切换时,用户的session状态都能保持一致。 **Session管理** 在实现负载均衡时...
在现代Web应用开发中,确保用户会话(session)在多台服务器之间共享是一项关键任务。这有助于提高系统的可扩展性和容错性,因为用户在切换服务器时无需重新登录或丢失状态信息。本主题将详细讲解如何利用Nginx、...
Session Description Protocol(SDP)是Internet工程任务组(IETF)定义的一种标准协议,文档编号为RFC2327。SDP主要用于在多媒体通信中描述会话或会议的特性,如音频、视频和其他数据流的类型、编码方式、传输地址...
本文将详细介绍如何在Windows环境下,利用Nginx作为反向代理服务器,与Tomcat集群配合实现负载均衡,并进行session复制,确保用户会话在不同服务器之间的一致性。 首先,Nginx是一款轻量级、高性能的HTTP和反向代理...
本文将详细解析解决Nginx Session共享问题的几种方法。 首先,通过负载均衡器来实现Session共享。在使用Nginx进行负载均衡时,可以通过配置ip_hash指令来确保同一个客户端的请求总是被转发到同一台服务器。这样,...
如果用户在集群中的不同节点之间跳转,session数据需要保持一致,否则会导致用户状态丢失。 这就是memcached发挥作用的地方。它是一个高性能、分布式的内存对象缓存系统,可以用来存储包括用户session在内的临时...
当用户在集群中的不同Tomcat实例之间跳转时,需要保持Session的一致性。这里采用Redis作为Session存储。首先,安装Redis并在所有Tomcat服务器上配置。 - 安装Redis:`yum install redis` - 修改Redis配置(如`...