【Session】Tomcat中Session持久化到文件系统或数据库
參考的優(yōu)秀文章
Tomcat Session 持久化
Package org.apache.catalina.session
?
最近同事在做Session外置的功能,我對Session持久化、共享也不太了解,學(xué)習(xí)一下。
?
一般來說,Tomcat原生的持久化Session方式,有StandardManager和PersistentManager。
版本說明:apache-tomcat-7.0.69-windows-x64
?
關(guān)閉、重啟Tomcat,是否持久化Session
Tomcat在關(guān)閉的時(shí)候,持久化Session到工作目錄中,然后再次啟動(dòng)時(shí)再加載,對用戶感覺Session是持續(xù)地存在的。
?
頁面用到一個(gè)實(shí)體類:
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;}@Overridepublic String toString() {return "User [id=" + id + ", userName=" + userName + "]";}} View Code(擴(kuò)展知識(shí))關(guān)于序列化:
需注意的是:因?yàn)榈綍r(shí)Session需要序列化到文件系統(tǒng)中,而這個(gè)類的對象需要放到Session中,所以這個(gè)類需要被序列化,故實(shí)現(xiàn)序列化接口。
如果實(shí)現(xiàn)序列化接口,強(qiáng)烈建議顯示定義serialVersionUID,它表明了序列化版本號(hào)。如果沒定義,serialVersionUID將由JVM自動(dòng)運(yùn)算,而serialVersionUID的運(yùn)算值高度依賴class的編譯結(jié)果,所以,基于穩(wěn)定性考慮,我們還是顯式定義此class的序列化版本為上。
?
實(shí)驗(yàn)步驟:
1、啟動(dòng)Tomcat,我們寫入往Session寫入一些東西。如果不確認(rèn)是否寫入,可以嘗試讀取出來,是否成功讀取。
2、關(guān)閉Tomcat,查看Tomcat的工作目錄的有沒有SESSIONS.ser文件。
文件的路徑可能跟我們運(yùn)行的環(huán)境有關(guān):
如果我用Tomcat獨(dú)立運(yùn)行,該文件位于:D:\green\apache-tomcat-7.0.69-windows-x64\apache-tomcat-7.0.69\work\Catalina\localhost\041SessionSerialization\SESSIONS.ser
如果在Eclipse運(yùn)行Tomcat,因Tomcat的工作目錄配置不同(不同的配置方式又不同),該文件在于:D:\workspace\jee_workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\041SessionSerialization\SESSIONS.ser
3、啟動(dòng)Tomcat,在沒有寫入Session的前提下,嘗試讀取Session,以測試Tomcat是否把持久化的Session恢復(fù)。
?
注:
如果Session重啟后沒有恢復(fù),檢查Tomcat的context.xml配置文件的這個(gè)部分:
<!-- Uncomment this to disable session persistence across Tomcat restarts --><!--<Manager pathname="" />--> View Code默認(rèn)的Tomcat配置是注釋著的,說明沒有禁用持久化緩存的功能,說明Tomcat重啟時(shí)默認(rèn)持久化Session。
?
使用PersistentManager持久化Session
PersistentManager的主要功能:在系統(tǒng)運(yùn)行中,持久化Session或恢復(fù)Session。
它的意義在于:
1、Tomcat關(guān)閉、重啟時(shí)的Session持久化
2、備份Session以增強(qiáng)系統(tǒng)容錯(cuò)能力
3、將處理內(nèi)存的Session持久化到硬盤,避免因Session過多而內(nèi)存溢出
?
持久化到文件系統(tǒng)
將Session持久化到文件系統(tǒng)的配置:
<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啟動(dòng)Tomcat后,寫入Session后,觀察TOMCAT_HOME/work/Catalina/localhost/session下文件的變化。
持久化到數(shù)據(jù)庫
將Session持久化到數(shù)據(jù)庫的配置:
跟上例類似,只不過這次的store是DB的store,是存儲(chǔ)策略的不同。(這里測試使用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&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?
然后表結(jié)構(gòu)如下:
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的驅(qū)動(dòng)包放入Tomcat的lib目錄下。
啟動(dòng)后,寫入Session后,觀察t_session的變化。
?
附錄
用到的類的關(guān)系圖
?
更多配置
關(guān)于StandardManager和PersistentManager更多的配置,請見Package org.apache.catalina.session。
總結(jié)
以上是生活随笔為你收集整理的【Session】Tomcat中Session持久化到文件系统或数据库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Eclipse配置CAS client
- 下一篇: Guava新集合-Multiset