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)

相关推荐

  • 将数据库遍历结果加入List集合中

    技术将数据库遍历结果加入List集合中 将数据库遍历结果加入List集合中package dao;import domain.User;
    import jdbcutil.util;import java

    礼包 2021年12月22日
  • 霸王龙和其他食肉恐龙,阿根延龙和霸王龙谁厉害

    技术霸王龙和其他食肉恐龙,阿根延龙和霸王龙谁厉害题主说的应该是阿根廷龙和霸王龙谁更厉害吧霸王龙和其他食肉恐龙?虽然两种动物都是恐龙,但是它们生活的时代却差了两千多万年。那要想知道两个不是同时期的恐龙究竟谁更厉害?我们只能

    生活 2021年10月26日
  • java的getclass方法(java中class使用方法)

    技术Java中的Object.getClass()怎么使用这篇文章主要介绍“Java中的Object.getClass()怎么使用”,在日常操作中,相信很多人在Java中的Object.getClass()怎么使用问题上

    攻略 2021年12月22日
  • 战国四大名将,白起,韩信,孙武,谁最厉害

    技术战国四大名将,白起,韩信,孙武,谁最厉害从后人对三人的评价来看战国四大名将,兵圣孙武、杀神白起、兵仙韩信,他们三人都是中国史上顶尖的军事将领。孙武军事理论成熟,为世人留下兵法十三篇,对后世影响深远,应该排第一;韩信点

    生活 2021年10月24日
  • SQL Server数据库mdf文件中了勒索病毒的解决方法是什么

    技术SQL Server数据库mdf文件中了勒索病毒的解决方法是什么这篇文章主要介绍“SQL Server数据库mdf文件中了勒索病毒的解决方法是什么”,在日常操作中,相信很多人在SQL Server数据库mdf文件中了

    攻略 2021年11月8日
  • 如何用MYSQL或者ORACLE的方法管理 POSTGRESQL

    技术如何用MYSQL或者ORACLE的方法管理 POSTGRESQL这期内容当中小编将会给大家带来有关如何用MYSQL或者ORACLE的方法管理 POSTGRESQL ,文章内容丰富且以专业的角度为大家分析和叙述,阅读

    攻略 2021年10月25日