tomcat会话之持久化会话管理器
前面提到的标准会话管理器已经提供了基础的会话管理功能,但在持久化方面做得还是不够,或者说在某些情景下无法满足要求,例如把会话以文件或数据库形式存储到存储介质中,这些都是标准会话管理器无法做到的,于是另外一种会话管理器被设计出来——持久化会话管理器。
在分析持久化会话管理器之前不妨先了解另外一个抽象概念会话存储设备Store,引入这个概念是为了更清晰方便地实现各种会话存储方式。作为存储设备最重要的操作无非就是读写操作,读即是将会话从存储设备加载到内存中,而写则将会话写入存储设备中,所以定义了两个重要的方法load和save与之相对应。FileStore和JDBCStore只要扩展Store接口各自实现load和save方法即可分别实现以文件或数据库形式存储会话。UML类图如下所示:
个,分别为”app”、”id”、”data”、”valid”、”maxinactive”、”lastaccess”,app字段用于区分哪个web应用,id字段即会话标识,data字段用于存放会话对象字节串,valid字段表示此会话是否有效,maxinactive字段表示最大存活时间,lastaccess字段表示最后访问时间。其中需要注意的是data字段,由于它的大小直接影响会话对象的大小,所以需要根据实际设置它的类型,如果是mysql可以考虑设置为Blob(65k)或MediumBlob(16m)。
这样一来,会话的加载和保存其实就转化为对数据库的读写操作了,而获取数据库连接的逻辑是先判断tomcat容器中是否有数据源,如果有则从数据源中直接获取一条连接使用,但是如果没有的话则会自己通过驱动去创建连接,需要注意的是从数据源中获取的连接在使用完后会放回数据源中,但自己通过驱动创建的连接使用完则不会关闭,这个很好理解,因为数据源是一个池,重新获取连接很快,而自建的连接重新创建一般需要秒级别的消耗,明显会造成大问题。
下面以mysql数据库为例配置一个JDBC存储设备:
<Store className="org.apache.catalina.session.JDBCStore"
connectionURL="jdbc:mysql://localhost:3306/web_session?user=user&password=password"
driverName="com.mysql.jdbc.Driver"
sessionAppCol="app_name"
sessionDataCol="session_data"
sessionIdCol="session_id"
sessionLastAccessedCol="last_access"
sessionMaxInactiveCol="max_inactive"
sessionTable="tomcat_sessions"
sessionValidCol="valid_session" />
其中关于会话表及其字段的一些属性可以不必配置,直接采用tomcat默认的即可,但驱动程序及连接url则一定要配置。
以JDBCStore为存储设备时从表面看起来并不会有明显的IO性能问题,因为它使用数据源获取连接,是一种池化技术,就算不存在数据源也是采用长久连接模式,一般数据流不是非常大的话都不会存在性能问题。
整个介绍完存储设备store后接着看持久化会话管理器,其实持久化会话管理器主要实现的就是三种逻辑下的对会话进行持久化操作,①当会话对象数量超过指定阀值时则将超出的会话对象转换出(保存到store中并把内存中的此对象删除)到store中;②当会话空闲时间超过指定阀值时则将此会话对象换出;③当会话空闲时间超过指定阀值时则将此会话进行备份(保存到store中并且内存还存在此对象)。
实现上面的逻辑只需对所有会话集合进行遍历即可,把符合条件的通过store保存。由于有些会话被持久化到store中,所以通过id查找会话时需先从内存中查找再往store查找。
下面是一个配置例子,会话数大于1000时则将空闲时间大于60秒的会话转移到store直到会话数量控制在1000,超过120秒空闲的会话被换出到store,超过180秒空闲的会话将备份到store。
<Manager className="org.apache.catalina.session.PersistentManager"
maxActiveSessions="1000"
minIdleSwap="60"
maxIdleSwap="120"
maxIdleBackup="180">
<Store className="org.apache.catalina.session.FileStore" directory="sessiondir"/>
</Manager>
所以在了解了两种Store后对持久化会话管理器的实现原理机制就相当清楚了,其实就是提供两种会话保存方式并提供管理这些会话的操作,它提高了tomcat状态处理相关方面的容错能力得到提升。
喜欢java的可以交个朋友:
tomcat会话之持久化会话管理器的更多相关文章
- 保持一个会话 添加 HTTP Cookie管理器
在线程组中添加 http cookie manager即可 场景:登录后点击刷新简历
- 集群增量会话管理器——DeltaManager
DeltaManager会话管理器是tomcat默认的集群会话管理器,它主要用于集群中各个节点之间会话状态的同步维护,由于相关内容涉及到集群,可能会需要一些集群通信相关知识,如果有疑问可结合集群相关章 ...
- HTTP属性管理器详解
1)HTTP Cache Manager 2)HTTP Cookie 管理器 3)HTTP 信息头管理器 4)HTTP 授权管理器 5)HTTP 请求默认值 为什么会有这些http属性的配置元件? ...
- HTTP属性管理器 初探
1)HTTP Cache Manager 2)HTTP Cookie 管理器 3)HTTP 信息头管理器 4)HTTP 授权管理器 5)HTTP 请求默认值 为什么会有这些http属性的配置元件? ...
- 标准会话管理器——StandardManager
用于保存状态的会话对象已经有了,现在就需要一个管理器来管理所有会话,例如会话id生成.根据会话id找出对应的会话.对于过期的会话进行销毁等等操作.用一句话描述标准会话管理器:提供一个专门管理某个web ...
- xshell 会话管理器快捷键
有没有发现xshell6关闭左边的会话管理器以后,打开就比较麻烦 那么可以自定义一个快捷键来打开: 然后输入一个快捷键 类型选择 菜单-->然后找会话管理器 完事儿 也可以自定义其他快捷键.自己 ...
- tomcat源码阅读之session管理器(Manager)
一.UML图分析: (一) Session: Session保存了一个客户端访问服务器时,服务器专门为这个客户端建立一个session用来保存相关的会话信息,session有一个有效时间,这个时间默认 ...
- Nginx+Tomcat+memcached高可用会话保持
Nginx+Tomcat+memcached高可用会话保持 文章来源dyc2005 一.概述 之前文章已经描述了企业高可用负载相关的架构及实现,其中常用的nginx或haproxy,LVS结合ke ...
- Tomcat学习笔记 - 错误日志 - NetBeans配置tomcat出错情况总结 -- 尚未授予访问 Tomcat 服务器的权限。请在服务器管理器的 Tomcat 定制器中设置 "manager-script" 角色的正确用户名和口令。 有关详细信息, 请查看服务器日志。
错误描述: 发布时控制台出现: 部署错误: 尚未授予访问 Tomcat 服务器的权限.请在服务器管理器的 Tomcat 定制器中设置 "manager-script" 角色的正确用 ...
随机推荐
- Latex 文本编辑技巧
临时取消首行缩进 \noindent 生成随机文本 \usepackage{lipsum} \begin{document} \lipsum \end{document} 多栏模式 \usepacka ...
- dubbo安装
dubbo 管控台可以对注册到 zookeeper 注册中心的服务或服务消费者进行管理,分享牛系列,分享牛专栏,分享牛.但管控台是否正常对 Dubbo 服务没有影响,管控台也不需要高可用,因此可以单节 ...
- Swift3中如何为Array写一个限定Type的扩展
我们知道Swift可以扩展已存在的类或结构,这些类或结构可以存在于标准库(或称为核心库)中.如果结构是一个集合类型(比如Array)就更有趣了.我们想尝试写一个限定Type数组的扩展,So我们就拿Ar ...
- Matplotlib Toolkits:python高级绘图库seaborn
http://blog.csdn.net/pipisorry/article/details/49515745 Seaborn介绍 seaborn (Not distributed with matp ...
- Android通过WebService实现图片的上传和下载(一)
这篇文章将讲解Android如果通过访问WebService接口实现图片的上传和下载,当然这不但需要大家懂得Android还要懂得WebService技术,安卓属于客户端,而webservice则属于 ...
- Apache shiro集群实现 (七)分布式集群系统下---cache共享
Apache shiro集群实现 (一) shiro入门介绍 Apache shiro集群实现 (二) shiro 的INI配置 Apache shiro集群实现 (三)shiro身份认证(Shiro ...
- Spring之WEB模块
Spring的WEB模块用于整合Web框架,例如Struts 1.Struts 2.JSF等 整合Struts 1 继承方式 Spring框架提供了ActionSupport类支持Struts 1的A ...
- EBS业务学习之采购管理
一.基础数据 w供应商档案 w采购员设置 w审批层次 w单据控制 w危险类代码 w检验代码 w自动来源 w供应商项目w目录册 二.业务流程 w请购单 w询价单 w报价单 w采购定单 w接收 w检验 w ...
- 【并发编程】ThreadPoolExecutor参数详解
ThreadPoolExecutor executor = new ThreadPoolExecutor( int corePoolSize, int maximumPoolSize, long ke ...
- C语言省略extern的缺陷
在一个文件中(比如a.c)定义一个全局变量int a = 10; 然后在另一个代码文件(比如main.c)中需要使用变量a,可以写 int a; 单独看main.c文件时就会出现二义性,一个含义是当其 ...