Tomcat - 持久化 Session


Session 是保存在內存中的,如果服務器重啟、宕機的話,Session 就會丟失。有時候,我們需要對 Session 持久化以應對意外的情況發生。例如,客戶端與服務器在交互過程中,可能因為 Session 的丟失而造成數據的丟失。還有一種情況,我們需要持久化 Session。如果當前用戶的訪問量巨大,大量的 Session 便會占用服務器大量的內存,從而使服務器的性能受到影響。如果能將一些閑置時間較長的 Session 換出,存儲至磁盤,便可以起到節省內存空間的作用。

需要注意的一點是,要持久化 Session,那么 Session 里存放的對象必須是可序列化的,即實現了 java.io.Serializable 接口。

Tomcat 通過兩個 Session 管理類來實現 Session 的持久化:org.apache.catalina.session.StandardManager 和 org.apache.catalina.session。 可以通過 $CATALINA_HOME/conf/context.xml 的 <Manager> 節點來配置 Session 的持久化方式。Tomcat 默認已經啟動了持久化配置,若要禁用持久化功能,只需在 <Context>節點里配置 <Manager pathname="" />。

 

StandardManager

這是 Tomcat 默認的 Session 管理類。StandardManager 不會使用任何的 Store 來存儲 session,當 Tomcat 正常關閉、重啟或 Web 應用程序重新加載時,StandardManager 會將內存中的 session 序列化到 $CATALINA_HOME/work/Catalina/hostname/webappname/SESSIONS.ser 文件中。當 Tomcat 重啟或 Web 應用程序加載完畢后,Tomcat 會反序列化將 session 還原至內存。需要注意的是,如果服務器沒有正常關閉而崩潰或被終止,則所有的 session 都會丟失,因為 StandardManager 沒有機會實現序列化持久存儲處理。

 

PersistentManager

PersistentManager 通過使用 Store 將內存中的 session 拷貝至文件或數據庫中。如果當前活動的 session 對象數量超過了上限值或者 session 對象閑置了過長時間,就會有 session 對象就會被換出,存儲到磁盤中,以節省內存空間。當 Tomcat 正常關閉、重啟或 Web 應用程序重新加載時,PersistentManager  也會像 StandardManager 一樣,將 session 對象持久化到磁盤中。當 session 對象復制存儲至磁盤中,原 session 對象可能仍存留在內存中。因此,如果 Web 應用突然非正常終止或服務器崩潰了,當服務器重啟,Web 應用重新加載的時候,便可以從磁盤中還原已持久化的 session。

Store 有兩種:FileStore 和 JDBCStore,分別用作於將 session 存儲至文件和數據庫。

FileStore

FileStore 用作於將 session 存儲至文件,通過 <Store/> 元素的 directory 屬性指定文件所在的目錄。

<?xml version="1.0" encoding="utf-8"?>
<Context>
  <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"/> </Manager>
</Context>

上述的配置,session 對象將會被存儲至 $CATALINA_HOME/work/Catalina/hostname/webappname/session/sessionID.session 文件中。

JDBCStore

JDBCStore 用作於將 session 存儲至數據庫。

1. context.xml 的配置:

<?xml version="1.0" encoding="utf-8"?>
<Context>

    <Manager className="org.apache.catalina.session.PersistentManager" 
        maxActiveSessions="-1" minIdleSwap="-1" maxIdleSwap="-1" maxIdleBackup="-1">
        <Store className="org.apache.catalina.session.JDBCStore" 
          driverName="com.mysql.jdbc.Driver" 
          connectionURL="jdbc:mysql://localhost:3306/tomcat?user=root&amp;password=root" 
          sessionTable="tomcat_sessions" 
          sessionIdCol="session_id" 
          sessionDataCol="session_data" 
          sessionValidCol="session_valid" 
          sessionMaxInactiveCol="max_inactive" 
          sessionLastAccessedCol="last_access" 
          sessionAppCol="app" 
          checkInterval="60"/>
    </Manager>
    
</Context>

2. 數據庫配置,注意需要在 $CATALINA_HOME/lib 目錄添加數據庫對應的驅動包:

DROP TABLE IF EXISTS tomcat_sessions ;
CREATE TABLE tomcat_sessions (
    session_id      VARCHAR(100) NOT NULL PRIMARY KEY,
    session_data    MEDIUMBLOB,
    session_valid   VARCHAR(16) NOT NULL,
    max_inactive    INT NOT NULL,
    last_access     BIGINT NOT NULL,
    app             VARCHAR (255),
    INDEX (app)
);

<Manager> 部分參數說明

maxActiveSessions:可處於活動狀態的 session 的數量的上限值,默認值為 -1,表示沒有限制。

minIdleSwap:session 可閑置的最短時間,超過該時間,Manager 可能會把 session 持久化到 Store 中,該 session 不會存留在內存中。單位為秒,默認值為 -1,表示沒有限制。

maxIdleSwap:session 可閑置的最長時間,超過該時間,Manager 將會把 session 持久化到 Store 中,該 session 不會存留在內存中。單位為秒,默認值為 -1,表示沒有限制。

maxIdleBackup:可閑置的時間,超過該時間,Manager 將會把 session 持久化到 Store 中,但該 session 對象仍然存留在內存中。單位為秒,默認值為 -1,表示沒有限制。

 

更多詳情,請參考:

https://tomcat.apache.org/tomcat-6.0-doc/config/manager.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM