Tomcat實現Session物件的持久化原理及配置方法介紹
當一個Session開始時,Servlet容器會為Session建立一個HttpSession物件。Servlet容器在某些情況下把這些 HttpSession物件從記憶體中轉移到檔案系統或資料庫中,在需要訪問 HttpSession資訊時再把它們載入到記憶體中。
實現:
要完成session持久化,存放在session裡的物件必須要實現java.io.Serializable介面。
Session的持久化是由Session Manager來管理的。Tomcat提供了兩個實現類:
org.apache.catalina.session.StandardManager (預設)
org.apache.catalina.session.PersistentManager
下面分別就StandardManager和PersistentManager兩種實現進行介紹。
配置:
Tomcat預設是已經啟用持久化配置,若要禁用持久化功能,則只需要在<Context>節點裡配置
<Manager pathname="" />;
持久化配置可進行全域性配置和針對某一站點進行配置。全域性配置需要在cof資料夾context.xml的
<Context>節點中配置<Manager>,若要針對某一站點配置則需要在cof資料夾server.xml的<Host><Context>
節點中新增<Manager>配置。
1.StandardManager
StandardManager是預設的Session Manager。它的實現機制為:當Tomcat伺服器關閉或重啟,或者Web應用被重新載入時,會對在記憶體中的HttpSession物件進行持久化, 並把它們儲存到檔案系統中,預設的檔案為<CATALINA_HOME>/work/Catalina/hostname/ applicationname/SESSIONS.ser。
<Manager
className=”org.apache.catalina.session.StandardManager”
debug=”0”
maxInactiveInterval=”-1″
/>
注:如果突然終止該伺服器,則所有會話都將喪失,因為StandardManager沒有機會實現存檔處理。
2.PersistentManager
PersistentManager能夠把Session物件儲存到Session Store中,它提供了比 StandardManager更為靈活的Session管理功能,它具有以下功能:
對記憶體中的HttpSession物件進行持久化,把它們儲存到Session Store中。
具有容錯功能,可以及時把Session備份到Session Store中,當Tomcat伺服器意外關閉後再重啟時,可以從Session Store中恢復Session物件。
可以靈活控制在記憶體中的Session數目,將部分Session轉移到Session Store中。
通過使用Store,將記憶體中的session備份到檔案或資料庫中。當備份一個session物件時,該session物件會被複制到儲存器中,而原物件仍然留在記憶體中。因此如果伺服器崩潰,就可以從儲存器中獲取活動的session物件。當session被換出時,他會被移動到儲存器中,因為當前活動的session物件超過了上限值,或者session物件閒置了過長時間。換出session節省記憶體空間。
Tomcat實現持久化Session Store的介面為org.apache.Catalina.store,目前提供了兩個實現這一介面的類,即 org.apache.Catalina.FileStore和org.apache.Catalina.JDBCStore。
實現配置PersistentManager大多是兩種形式
形式一:儲存在本地檔案中需要配置conf目錄裡的context.xml檔案
在<Context>節點下新增如下<Manager>節點: