單機時代對會話的管理主要有兩種方式——非持久化方式和持久化方式。非持久化方式指會話直接由tomcat管理并保存在機器內存上,它是最簡單的方式,如下圖,所有的會話集合都保存在內存上,客戶端訪問時根據自己的會話id直接在服務器內存中尋找,查找簡單且速度快,但同時也存在兩個缺點:一是容量比較小,當數據量大時容易導致內存不足;一是機器意外停止會導致會話數據丟失缺點。
?
為了解決上面非持久化方式存在的缺陷,我們需要引入持久化機制,即持久化方式。可以將會話數據以文件形式持久化到硬盤中,也可以通過數據庫持久化會話數據。首先看硬盤持久化,如下圖,會話數據會以文件形式保存在硬盤中,由于硬盤比存儲空間比內存大且機器意外關機都不會使數據丟失,所以硬盤存儲解決了上面兩個缺點,但是硬盤讀取的速度比較慢,可能會影響整體的響應時間,硬盤持久化方式在實際中基本不會使用。
?
Tomcat提供的另外一種默認的持久化方式就是將會話數據持久化到數據庫上,所有會話數據交由數據庫存儲,tomcat通過jdbc數據庫驅動并使用連接池技術去數據庫指定表讀取會話信息,此種方式解決了非持久化方式的所有缺點同時也對以文件方式存儲方式的IO進行了優化,用數據庫存儲會話其實是一種集中管理模式,現在實際中更多是使用一個分布式緩存替代數據庫,例如memcached、redis集群等,因為緩存的查詢讀取速度快,且集群解決了高可用的問題,但Tomcat官方版本是不提供會話保存到memcached或redis的支持,如要使用可自己編寫一個會話管理器及一個閥門valve,或使用第三方jar包。需要說明的是集中管理模式不管是tomcat單機還是集群模式都可以使用。
?