Tomcat的Session持久化策略是什么

技术Tomcat的Session持久化策略是什么Tomcat的Session持久化策略是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。关于Tomcat的

Tomcat的会话持久性策略是什么?我相信很多没有经验的人都不知所措。因此,本文总结了问题产生的原因及解决方法。希望你能通过这篇文章解决这个问题。

至于Tomcat的Session,我们都知道它默认存储在内存中。为了解决重启应用服务器时缺少Session的问题,Tomcat中的StandardManager会在正常关机时钝化活动Session,重启时重新加载。

雄猫,除了StandardManager,还提供:持久会话对应的经理PersistentManager。目前有两种对应的持久化实现。

文件存储

JDBCStore

将活动会话分别保存在磁盘和数据库上。

这一次,我们以文件存储为例来分析PersistentManager在Tomcat中的实现。

配置

PersistentManager的配置基本如下:

managerassname=' org . Apache . catalina . session . persistentmanager ' debug=' 0 ' saveornestart=' true ' maxactivesessions='-1 ' minIdleSwap='-1 ' maxIdleSwap=' 5 ' maxId Lebackup=' 3 ' Store类名=' org . Apache . catalina . session . FileStore ' directory='/home/my testsession//manager对于filestore和JDBCStore,基本配置相似,只是Store的特定属性不同,例如JD上述配置可以直接用于文件存储。

其中,maxIdleBackup、maxIdleSwap、minIdleSwap默认都是关闭的,默认值为-1。当然,我们上面的配置已经修改了。的默认行为将与标准管理器一致,即在关闭和重新启动时将执行会话的钝化和解析。

当按照我们上面的配置启动Tomcat时,服务器将根据maxIdleBackup的时间以秒为单位持续空闲会话。在配置的目录中,将生成一个以sessionId作为文件名的文件。

示例:5e 62468 BF 33 cf 7 de 28464 a 76416 b 85e . session

主要参数描述:

savenrestart-服务器关闭时是否保留所有会话;

max session-可以活动的会话数;

minidleswap/maxileswap会话处于非活动状态的时间最短/最长,会话对象被传输到文件存储;

maxidlebackup-会话将在大于此时间时进行备份。

写入文件:

public void save(SessionSession)throwSioException {//OpenanoutputStreamthospectidpathname,ifanyFilefile=file(session . Getidinternal());if(file==null){nbsp

;     return;        }        if (manager.getContext().getLogger().isDebugEnabled()) {            manager.getContext().getLogger().debug(sm.getString(getStoreName() + ".saving",                             session.getIdInternal(), file.getAbsolutePath()));        }         try (FileOutputStream fos = new FileOutputStream(file.getAbsolutePath());                ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(fos))) {            ((StandardSession)session).writeObjectData(oos);        }    }

我们来看load操作,和StandardManager加载Session基本一致,先创建空的session,再readObjectData:

    public Session load(String id) {        File file = file(id);        Context context = getManager().getContext();        try (FileInputStream fis = new FileInputStream(file.getAbsolutePath());                ObjectInputStream ois = getObjectInputStream(fis)) {             StandardSession session = (StandardSession) manager.createEmptySession();            session.readObjectData(ois);            session.setManager(manager);            return session;        } catch (FileNotFoundException e) {            return null;        }    }

删除操作:

public void remove(String id) throws IOException {    File file = file(id);    file.delete();}

而这些load,remove等操作的触发点,就是我们之前提到过的后台线程:我们在前面分析过期的session是如何处理的时候,曾提到过,可以移步这里:对于过期的session,Tomcat做了什么?

都是使用backgroundProcess

public void backgroundProcess() {    count = (count + 1) % processExpiresFrequency;    if (count == 0)        processExpires();}

PersistentManager的processExpires方法中,重点有以下几行

        processPersistenceChecks();        if (getStore() instanceof StoreBase) {            ((StoreBase) getStore()).processExpires();        }

其中在processPersistenceChecks中,就会对我们上面配置的几项进行检查,判断是否要进行session文件的持久化等操作

/** * Called by the background thread after active sessions have been checked * for expiration, to allow sessions to be swapped out, backed up, etc. */public void processPersistenceChecks() {     processMaxIdleSwaps();    processMaxActiveSwaps();    processMaxIdleBackups(); }

此外,通过配置pathname为空,即可禁用session的持久化策略,在代码中,判断pathname为空时,不再创建持久化文件,从而禁用此功能。

  <Manager pathname="" />

总结下,正如文档中所描述,StandardManager所支持的重启时加载已持久化的Session这一特性,相比PersistentManager只能算简单实现。要实现更健壮、更符合生产环境的重启持久化,最好使用PersistentManager并进行恰当的配置。

看完上述内容,你们掌握Tomcat的Session持久化策略是什么的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/138397.html

(0)

相关推荐

  • 苹果手机如何删除通讯录联系人,苹果id怎么删除电话号码

    技术苹果手机如何删除通讯录联系人,苹果id怎么删除电话号码苹果手机删除电话号方法苹果手机如何删除通讯录联系人: 以iPhone8手机为例,删除“联系人”(电话号码)有如下操作: 一、在手机桌面打开“电话”。
    二、打开“

    生活 2021年10月22日
  • 如何浅析客舱服务开题报告(如何浅析以前文学作品)

    技术如何浅析Go-To-Market本篇文章给大家分享的是有关如何浅析Go-To-Market,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Go-To-Ma

    攻略 2021年12月18日
  • 涨粉丝1元1000个粉丝平台,有什么好的抖音刷粉平台?

    技术涨粉丝1元1000个粉丝平台,有什么好的抖音刷粉平台?涨粉丝1元1000个粉丝平台,有什么好的抖音刷粉平台?抖音的推出让许多网友在闲暇之余又有了一种消遣的方式,也出现了众多的抖音大咖网红。很多人在抖音上有众多的粉丝,

    测评 2021年11月11日
  • 第二十三章 Centos7下Docker安装kibana

    技术第二十三章 Centos7下Docker安装kibana 第二十三章 Centos7下Docker安装kibana一、查找kibana镜像
    [root@staging ~]# docker sear

    礼包 2021年12月24日
  • 什么是InnoDB存储引擎

    技术什么是InnoDB存储引擎这篇文章主要介绍“什么是InnoDB存储引擎”,在日常操作中,相信很多人在什么是InnoDB存储引擎问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”什么是Inn

    攻略 2021年10月28日
  • 1千伏安等于多少千瓦,KVA与KW有什么区别

    技术1千伏安等于多少千瓦,KVA与KW有什么区别KVA与KW有什么区别?答:KVA是视在功率(S)的表示方法1千伏安等于多少千瓦。它指交流电源所能提供的总功率称为视在功率或表现功率,在数值上是交流电路中电压与电流的乘积。

    生活 2021年10月27日