zoukankan      html  css  js  c++  java
  • 【Session】Tomcat中Session持久化到文件系统或数据库

    参考的优秀文章

    Tomcat Session 持久化

    Package org.apache.catalina.session

    最近同事在做Session外置的功能,我对Session持久化、共享也不太了解,学习一下。

    一般来说,Tomcat原生的持久化Session方式,有StandardManager和PersistentManager。

    版本说明:apache-tomcat-7.0.69-windows-x64

    关闭、重启Tomcat,是否持久化Session

    Tomcat在关闭的时候,持久化Session到工作目录中,然后再次启动时再加载,对用户感觉Session是持续地存在的。

    页面用到一个实体类:

    package com.nicchagil.session;
    
    import java.io.Serializable;
    
    public class User implements Serializable {
        
        private static final long serialVersionUID = 1L;
        
        private Integer id;
        private String userName;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getUserName() {
            return userName;
        }
    
        public void setUserName(String userName) {
            this.userName = userName;
        }
    
        @Override
        public String toString() {
            return "User [id=" + id + ", userName=" + userName + "]";
        }
        
    }
    View Code

    (扩展知识)关于序列化

    需注意的是:因为到时Session需要序列化到文件系统中,而这个类的对象需要放到Session中,所以这个类需要被序列化,故实现序列化接口。

    如果实现序列化接口,强烈建议显示定义serialVersionUID,它表明了序列化版本号。如果没定义,serialVersionUID将由JVM自动运算,而serialVersionUID的运算值高度依赖class的编译结果,所以,基于稳定性考虑,我们还是显式定义此class的序列化版本为上。

    实验步骤:

    1、启动Tomcat,我们写入往Session写入一些东西。如果不确认是否写入,可以尝试读取出来,是否成功读取。

    2、关闭Tomcat,查看Tomcat的工作目录的有没有SESSIONS.ser文件。

    文件的路径可能跟我们运行的环境有关:

    如果我用Tomcat独立运行,该文件位于:D:greenapache-tomcat-7.0.69-windows-x64apache-tomcat-7.0.69workCatalinalocalhost41SessionSerializationSESSIONS.ser

    如果在Eclipse运行Tomcat,因Tomcat的工作目录配置不同(不同的配置方式又不同),该文件在于:D:workspacejee_workspace.metadata.pluginsorg.eclipse.wst.server.core mp0workCatalinalocalhost41SessionSerializationSESSIONS.ser

    3、启动Tomcat,在没有写入Session的前提下,尝试读取Session,以测试Tomcat是否把持久化的Session恢复。

    注:

    如果Session重启后没有恢复,检查Tomcat的context.xml配置文件的这个部分:

        <!-- Uncomment this to disable session persistence across Tomcat restarts -->
        <!--
        <Manager pathname="" />
        -->
    View Code

    默认的Tomcat配置是注释着的,说明没有禁用持久化缓存的功能,说明Tomcat重启默认持久化Session。

    使用PersistentManager持久化Session

    PersistentManager的主要功能:在系统运行中,持久化Session或恢复Session。

    它的意义在于:

    1、Tomcat关闭、重启时的Session持久化

    2、备份Session以增强系统容错能力

    3、将处理内存的Session持久化到硬盘,避免因Session过多而内存溢出

    持久化到文件系统

    将Session持久化到文件系统的配置:

        <Manager className="org.apache.catalina.session.PersistentManager"
            saveOnRestart="true"
            maxActiveSession="-1"
            minIdleSwap="0"
            maxIdleSwap="30"
            maxIdleBackup="0"
        > 
    
        <Store className="org.apache.catalina.session.FileStore"
            checkInterval="60"
            directory="../session/mySession.session"/>
        </Manager>
    View Code

    启动Tomcat后,写入Session后,观察TOMCAT_HOME/work/Catalina/localhost/session下文件的变化。

    持久化到数据库

    将Session持久化到数据库的配置:

    跟上例类似,只不过这次的store是DB的store,是存储策略的不同。(这里测试使用MySQL 5.0)

        <Manager className="org.apache.catalina.session.PersistentManager"
            saveOnRestart="true"
            maxActiveSession="-1"
            minIdleSwap="0"
            maxIdleSwap="30"
            maxIdleBackup="0"
        > 
        
        <!-- file store -->
        <!-- 
        <Store className="org.apache.catalina.session.FileStore"
            checkInterval="60"
            directory="../session"/>
        -->
        
        <!-- db store -->
        <Store className="org.apache.catalina.session.JDBCStore"
            driverName="com.mysql.jdbc.Driver" 
            connectionURL="jdbc:mysql://localhost:3306/demo?user=root&amp;password=123456" 
            sessionTable="t_session" 
            sessionIdCol="session_id" 
            sessionDataCol="data" 
            sessionValidCol="session_valid" 
            sessionMaxInactiveCol="max_inactive" 
            sessionLastAccessedCol="last_access"
            sessionAppCol="application_name" 
            checkInterval="60" 
            debug="99" />
            
        </Manager>
    View Code

    然后表结构如下:

    CREATE TABLE `t_session` (
      `session_id` varchar(128) DEFAULT NULL,
      `data` mediumblob,
      `max_inactive` int(128) DEFAULT NULL,
      `last_access` bigint(20) DEFAULT NULL,
      `application_name` varchar(128) DEFAULT NULL,
      `session_valid` char(1) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    View Code

    记得将MySQL的驱动包放入Tomcat的lib目录下。

    启动后,写入Session后,观察t_session的变化。

    附录

    用到的类的关系图

    更多配置

    关于StandardManager和PersistentManager更多的配置,请见Package org.apache.catalina.session

  • 相关阅读:
    巨蟒python全栈开发-第17天 核能来袭-成员
    常用Git命令大全思维导图
    Android传递Bitmap的两种简单方式及其缺陷
    功能强大的图片截取修剪神器:Android SimpleCropView及其实例代码重用简析
    Package pdftex.def Error: PDF mode expected, but DVI mode detected!
    Android第三方开源图片裁剪截取:cropper
    Android第三方文件选择器:aFileChooser
    Android实现ViewPager无限循环滚动回绕
    AndroidTreeView:Android树形节点View
    Android DynamicGrid:拖曳交换位置
  • 原文地址:https://www.cnblogs.com/nick-huang/p/5672298.html
Copyright © 2011-2022 走看看