前面提到的标准会话管理器已经提供了基础的会话管理功能,但在持久化方面做得还是不够,或者说在某些情景下无法满足要求,例如把会话以文件或数据库形式存储到存储介质中,这些都是标准会话管理器无法做到的,于是另外一种会话管理器被设计出来——持久化会话管理器。

在分析持久化会话管理器之前不妨先了解另外一个抽象概念会话存储设备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会话之持久化会话管理器的更多相关文章

  1. 保持一个会话 添加 HTTP Cookie管理器

    在线程组中添加 http cookie manager即可 场景:登录后点击刷新简历

  2. 集群增量会话管理器——DeltaManager

    DeltaManager会话管理器是tomcat默认的集群会话管理器,它主要用于集群中各个节点之间会话状态的同步维护,由于相关内容涉及到集群,可能会需要一些集群通信相关知识,如果有疑问可结合集群相关章 ...

  3. HTTP属性管理器详解

      1)HTTP Cache Manager 2)HTTP Cookie 管理器 3)HTTP 信息头管理器 4)HTTP 授权管理器 5)HTTP 请求默认值 为什么会有这些http属性的配置元件? ...

  4. HTTP属性管理器 初探

      1)HTTP Cache Manager 2)HTTP Cookie 管理器 3)HTTP 信息头管理器 4)HTTP 授权管理器 5)HTTP 请求默认值 为什么会有这些http属性的配置元件? ...

  5. 标准会话管理器——StandardManager

    用于保存状态的会话对象已经有了,现在就需要一个管理器来管理所有会话,例如会话id生成.根据会话id找出对应的会话.对于过期的会话进行销毁等等操作.用一句话描述标准会话管理器:提供一个专门管理某个web ...

  6. xshell 会话管理器快捷键

    有没有发现xshell6关闭左边的会话管理器以后,打开就比较麻烦 那么可以自定义一个快捷键来打开: 然后输入一个快捷键 类型选择 菜单-->然后找会话管理器 完事儿 也可以自定义其他快捷键.自己 ...

  7. tomcat源码阅读之session管理器(Manager)

    一.UML图分析: (一) Session: Session保存了一个客户端访问服务器时,服务器专门为这个客户端建立一个session用来保存相关的会话信息,session有一个有效时间,这个时间默认 ...

  8. Nginx+Tomcat+memcached高可用会话保持

    Nginx+Tomcat+memcached高可用会话保持 文章来源dyc2005   一.概述 之前文章已经描述了企业高可用负载相关的架构及实现,其中常用的nginx或haproxy,LVS结合ke ...

  9. Tomcat学习笔记 - 错误日志 - NetBeans配置tomcat出错情况总结 -- 尚未授予访问 Tomcat 服务器的权限。请在服务器管理器的 Tomcat 定制器中设置 "manager-script" 角色的正确用户名和口令。 有关详细信息, 请查看服务器日志。

    错误描述: 发布时控制台出现: 部署错误: 尚未授予访问 Tomcat 服务器的权限.请在服务器管理器的 Tomcat 定制器中设置 "manager-script" 角色的正确用 ...

随机推荐

  1. Spark Streaming中的操作函数分析

    根据Spark官方文档中的描述,在Spark Streaming应用中,一个DStream对象可以调用多种操作,主要分为以下几类 Transformations Window Operations J ...

  2. oracle11实战详解

    因为最近可以学习oracle了,所以昨天把oracle装好了,装的时候因为种种不知名的原因,把我的mysql居然连连不上了.说实话如果自己看教程安装的话还是有一点小复杂的,特别是对于我这种学渣来说,我 ...

  3. 深度学习与计算机视觉系列(2)_图像分类与KNN

    作者: 寒小阳 &&龙心尘 时间:2015年11月. 出处: http://blog.csdn.net/han_xiaoyang/article/details/49949535 ht ...

  4. list标准函数的模拟

    ;反序 ( ) -> ( ) (define (rvs x) (let recur ((x x)(res '())) (if (null? x) res (recur (cdr x) (cons ...

  5. C语言如何在两个文件中访问同一个全局变量

    方法一: 不使用头文件. 1.c 中 int var; 2.c 中 extern int var; 方法二: 使用头文件. 1.c 中 int var; 不必添加#include "1.h& ...

  6. GitHub无法访问或访问缓慢解决办法

    缘由 由于众所周知的原因,Github最近无法访问或访问很慢.由于Github支持https,因此此次屏蔽Github采用的方法是dns污染,用户访问github会返回一个错误的IPFQ当然是一种解决 ...

  7. python地理数据处理库geopy

    http://blog.csdn.net/pipisorry/article/details/52205266 python地理位置处理 python地理编码地址以及用来处理经纬度的库 GeoDjan ...

  8. (Android自定义View)来来来,一起再撸一个Material风格loadingView。

    本文同步自博主的个人博客wing的地方酒馆 很久很久以前,撸了一款loadingview(点击这里回顾),当时觉得还不错,现在看看觉得好丑啊!!! 于是想再撸一个,无意间在这里看到一个很不错的效果,于 ...

  9. mysql数据库连接池使用(一)dbcp方式的配置

    Apache的数据库连接池 DBCP的常用配置说明,因为项目中用到了需要对其封装,所以必须先了解怎么配置以及各个配置字段的含义,理解的基础上开发我们自己的数据库连接池.可以参考官网dbcp官网. db ...

  10. SQL 2012 Always On 为 MSCRMSqlClrLogin SQL 登录名创建非对称密钥时报语法错误

    根据实施手册中的下图的SQL在为MSCRMSqlClrLogin 创建非对称秘钥时报语法错误,具体的错误在就path那,调了多次还是报错,索性就把SQL拆开执行. 先执行这条 SELECT * FRO ...