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)

相关推荐

  • MongoDB和MySQL的区别有哪些

    技术MongoDB和MySQL的区别有哪些这篇文章主要讲解了“MongoDB和MySQL的区别有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MongoDB和MySQ

    攻略 2021年12月2日
  • SQL Server中的Forwarded Record计数器影响IO性能的解决方法

    技术SQL Server中的Forwarded Record计数器影响IO性能的解决方法SQL Server中的Forwarded Record计数器影响IO性能的解决方法,针对这个问题,这篇文章详细介绍了相对应的分析和

    攻略 2021年12月1日
  • 基于layui如何实现登录页面

    技术基于layui如何实现登录页面本篇内容主要讲解“基于layui如何实现登录页面”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“基于layui如何实现登录页面”吧!首先给看下

    攻略 2021年11月26日
  • 求圆的面积公式,用直径计算圆面积的公式

    技术求圆的面积公式,用直径计算圆面积的公式圆用直径算面积公式:S=πd²/4其中:S表示圆的面积求圆的面积公式,d表示圆的直径;圆的概念1.到定点的距离等于定长的点的集合叫做圆。这个定点叫做圆的圆心,通常用字母“o”表示

    生活 2021年10月23日
  • CF666C 题解

    技术CF666C 题解 CF666C 题解题目大意
    多组询问。每次询问给定一个串 \(s\) 和一个长度 \(L\)。
    问有多少个长度为 \(L\) 的只包含小写字母的串, 有至少一个子序列等于 \(s

    礼包 2021年11月7日
  • 怎么解决内存泄漏问题

    技术怎么解决内存泄漏问题本篇内容介绍了“怎么解决内存泄漏问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!问题排查首先确

    攻略 2021年10月26日