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)

相关推荐

  • 碳酸钙与稀盐酸反应的化学方程式,盐酸与碳酸钙的反应方程式

    技术碳酸钙与稀盐酸反应的化学方程式,盐酸与碳酸钙的反应方程式由于碳酸钙与稀盐酸反应生成氯化钙、二氧化碳和水碳酸钙与稀盐酸反应的化学方程式:  所以碳酸钙与稀盐酸反应的现象是:  碳酸钙逐渐减少,有气泡产生。如果CaCO3

    生活 2021年10月20日
  • Java中Future和FutureTask怎么用

    技术Java中Future和FutureTask怎么用小编给大家分享一下Java中Future和FutureTask怎么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、Future 接口当 call

    攻略 2021年11月30日
  • Pandas数据分析实用小技巧有哪些

    技术Pandas数据分析实用小技巧有哪些这篇文章给大家分享的是有关Pandas数据分析实用小技巧有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。小技巧1:如何使用map对某些列做特征工程?

    2021年11月30日
  • 怎么使用tophat-fusion鉴定融合基因

    技术怎么使用tophat-fusion鉴定融合基因这期内容当中小编将会给大家带来有关怎么使用tophat-fusion鉴定融合基因,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。toph

    攻略 2021年11月10日
  • C/C++值传递和址传递有什么区别

    技术C/C++值传递和址传递有什么区别这篇文章主要为大家展示了“C/C++值传递和址传递有什么区别”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C/C++值传递和址传递有什么

    攻略 2021年10月27日
  • sqlite如何设置列的取值范围(sqlite数据库怎么添加权限)

    技术SQLite添加列的限制有哪些这篇文章主要为大家展示了“SQLite添加列的限制有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SQLite添加列的限制有哪些”这篇文

    攻略 2021年12月17日