单机时代对会话的管理主要有两种方式——非持久化方式和持久化方式。非持久化方式指会话直接由tomcat管理并保存在机器内存上,它是最简单的方式,如下图,所有的会话集合都保存在内存上,客户端访问时根据自己的会话id直接在服务器内存中寻找,查找简单且速度快,但同时也存在两个缺点:一是容量比较小,当数据量大时容易导致内存不足;一是机器意外停止会导致会话数据丢失缺点。
![](https://box.kancloud.cn/2016-01-15_5698bd905fd6c.jpg)
为了解决上面非持久化方式存在的缺陷,我们需要引入持久化机制,即持久化方式。可以将会话数据以文件形式持久化到硬盘中,也可以通过数据库持久化会话数据。首先看硬盘持久化,如下图,会话数据会以文件形式保存在硬盘中,由于硬盘比存储空间比内存大且机器意外关机都不会使数据丢失,所以硬盘存储解决了上面两个缺点,但是硬盘读取的速度比较慢,可能会影响整体的响应时间,硬盘持久化方式在实际中基本不会使用。
![](https://box.kancloud.cn/2016-01-15_5698bd907c45f.jpg)
Tomcat提供的另外一种默认的持久化方式就是将会话数据持久化到数据库上,所有会话数据交由数据库存储,tomcat通过jdbc数据库驱动并使用连接池技术去数据库指定表读取会话信息,此种方式解决了非持久化方式的所有缺点同时也对以文件方式存储方式的IO进行了优化,用数据库存储会话其实是一种集中管理模式,现在实际中更多是使用一个分布式缓存替代数据库,例如memcached、redis集群等,因为缓存的查询读取速度快,且集群解决了高可用的问题,但Tomcat官方版本是不提供会话保存到memcached或redis的支持,如要使用可自己编写一个会话管理器及一个阀门valve,或使用第三方jar包。需要说明的是集中管理模式不管是tomcat单机还是集群模式都可以使用。
![](https://box.kancloud.cn/2016-01-15_5698bd9095b51.jpg)