Telling Tomcat to save session records in MySQL

此部分内容摘自 MySQL cookbook 3th。具体内容不做翻译,哈哈,懒

The default Tomcat default session storage mechanism uses temporary files. To save

sessions using JDBC with MySQL instead, follow this procedure:

  1. Create a table to hold session records.
  2. Make sure that Tomcat can access the proper JDBC driver.
  3. Modify the appropriate Tomcat configuration file to specify use of a persistent ses‐

    sion manager for the relevant application context.

None of these steps involve modifying the sample session script in any way, which

reflects how Tomcat implements session support above the application level.

Create the Tomcat session table.

  1. Tomcat stores several types of information in the session table:
  2. The session ID. By default, IDs are 32-character MD5 values.
  3. The application name.
  4. The session data. This is a serialized string.
  5. Whether the session is valid, as a single byte.
  6. The maximum permitted inactivity time, as a 32-bit integer measured in seconds.
  7. The last access time, as a 64-bit integer.

The following table satisfies those specifications; create it now before proceeding:

CREATE TABLE tomcat_session
(
id VARCHAR(32) NOT NULL,
app VARCHAR(255),
data LONGBLOB,
valid_session CHAR(1) NOT NULL,
max_inactive INT NOT NULL,
update_time BIGINT NOT NULL,
PRIMARY KEY (id),
INDEX (app)
);

Place the JDBC driver where Tomcat can find it.

Because Tomcat itself manages sessions, it must be able to access the JDBC driver

used to store sessions in a database. It’s common to install drivers in the lib directory

of the Tomcat tree so that they’re available both to Tomcat and to applications.(备注:如果war中中已经有引用 mysql jdbc driver 则不需要专门将驱动jar包拷贝到 tomcat 的lib 目录下)

Modify the Tomcat configuration file.

To tell Tomcat to use the tomcat_session table, modify the mcb application context

file. Change location into the webapps/mcb/META-INF under the Tomcat we

bapps directory, copy context.xml.jdbc to context.xml, and restart Tomcat.

If you look in context.xml, you’ll find a <Context> element containing a <Manager> element that specifies the use of JDBC for MySQL-based session storage:

<Manager
className="org.apache.catalina.session.PersistentManager"
saveOnRestart="true"
maxIdleBackup="600"
maxIdleSwap="1200"
minIdleSwap="900">
<Store
className="org.apache.catalina.session.JDBCStore"
driverName="com.mysql.jdbc.Driver"
connectionURL=
"jdbc:mysql://localhost/cookbook?user=cbuser&amp;password=cbpass&amp;useSSL=false"
sessionTable="tomcat_session"
sessionIdCol="id"
sessionAppCol="app"
sessionDataCol="data"
sessionValidCol="valid_session"
sessionMaxInactiveCol="max_inactive"
sessionLastAccessedCol="update_time"
/>
</Manager>

The <Manager> element attributes specify general session-related options. Within the

<Manager> element body, the <Store> element provides attributes pertaining to the

JDBC driver. The following discussion focuses on the attributes shown in the example,

but there are others you can use. For more information, see the Tomcat session-

management documentation.

The <Manager> attributes shown in the example have the following meanings:

  • className:The Java class that implements persistent session storage. It must be

    org.apache.catalina.session.PersistentManager .
  • saveOnRestart:Whether application sessions survive server restarts. Set it to true to have Tomcat

    save current sessions when it shuts down (and reload them when it starts up).
  • maxIdleBackup:The number of seconds before inactive sessions are eligible for being saved to MySQL. A value of -1 (the default) means “never.”
  • maxIdleSwap:The number of seconds before idle sessions should be swapped (saved to MySQL and passivated out of server memory). A value of -1 (the default) means “never.”

    If not -1 , the value should be at least as great as maxIdleBackup .
  • minIdleSwap:The number of seconds before idle sessions are eligible to be swapped. A value of -1 (the default) means “never.” If not -1 , the value should be less than maxIdleSwap

Within the <Manager> element, the <Store> element indicates how to connect to the

database server, the names of the database and table for storing session records, and the

names of the columns in the table:

  • className:The name of a class that implements the org.apache.catalina.Store interface.

    For JDBC-based storage managers, the value is org.apache.catalina.session.JDBCStore .

  • driverName:The class name for the JDBC driver. For the Connector/J driver, the value is com.mysql.jdbc.Driver.

  • connectionURL:The URL for connecting to the database server, with characters that are special in XML properly encoded. The following URL connects to the MySQL server on the local host, using a database, username, and password of cookbook , cbuser , and cbpass , respectively. Notice that the & character that separates the user and pass word connection parameters is written as the & entity: jdbc:mysql://localhost/cookbook?user=cbuser&password=cbpass

  • sessionTable The table in which to store session records. For our example, this is the tomcat_session table described earlier.

(The database that contains the table appears in the connectionURL value.) The remaining attributes in the example indicate the column names in the session table. These attributes are sessionIdCol , sessionAppCol , sessionDataCol, sessionValidCol , sessionMaxInactiveCol , and sessionLastAccessedCol , which correspond in the obvious way to columns of the tomcat_session table.

可能存在的问题

MySQL 大版本指尖引用类名包路径改变

此部分内容摘自:com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver的区别 serverTimezone设定

com.mysql.jdbc.Driver 是 mysql-connector-java 5中的,

com.mysql.cj.jdbc.Driver 是 mysql-connector-java 6中的

1、JDBC连接Mysql5 com.mysql.jdbc.Driver:

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false
username=root
password=1234

2、JDBC连接Mysql6 com.mysql.cj.jdbc.Driver, 需要指定时区serverTimezone:

driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false
username=root
password=1234

在设定时区的时候,如果设定serverTimezone=UTC,会比中国时间早8个小时,如果在中国,可以选择Asia/Shanghai或者Asia/Hongkong,例如:

driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?serverTimezone=Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false
username=root
password=

Java连接MySQL数据库,提示Establishing SSL connection without警告

此内容摘自:Java连接MySQL数据库,提示Establishing SSL connection without警告

Java在连接MySQL数据库时,输出如下警告信息**

Tue Jul 11 18:04:07 CST 2017 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.

解决办法

  1. 在jdbc连接后添加 useSSL=false 参数
url=jdbc:mysql://localhost:3306/es?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&useSSL=false
  1. 如果以上办法无效,则降低 mysql-connector-java 依赖版本,如下
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>

总结

一般来说小版本之间的跨度不影响使用,但是大版本之间的使用差别将会很大,所以得要确认MySQL的版本并找到对应最合适的驱动。

tomcat 默认是将这部分session相关的信息放在文件里边的,通过上述的配置能够将对应的信息放到MySQL中,如果大并发大数据量的情况下性能应该更好一些。实际上如果有多个tomcat,可以让这些Tomcat都连接到该数据库,则可以实现分布式session的共享。当然在大并发大数据的情况下往往更好的做法是将session的信息放到redis 中,性能应该会更好一些。

欢迎转载,但请注明本文链接,谢谢你。

2018.8.19 17:57

Tomcat生成的session持久化到MySQL的更多相关文章

  1. Tomcat下 session 持久化问题(重启服务器session 仍然存在)

    感谢大佬:https://www.iteye.com/blog/xiaolongfeixiang-560800 关于在线人数统计,大都使用SessionListener监听器实现. SessionLi ...

  2. [转]session 持久化问题(重启服务器session 仍然存在)

    转:http://xiaolongfeixiang.iteye.com/blog/560800 关于在线人数统计,大都使用SessionListener监听器实现. SessionListener 触 ...

  3. Tomcat 之session 持久化2

    通过前文 Tomcat 之session 持久化1 ,我们已经大概了解了这么个机制.但是我没能详细展开其底层的原理. 这篇文章,我想稍微深入一点点,再继续聊一聊其底层. Tomcat 之session ...

  4. 【Session】Tomcat中Session持久化到文件系统或数据库

    参考的优秀文章 Tomcat Session 持久化 Package org.apache.catalina.session 最近同事在做Session外置的功能,我对Session持久化.共享也不太 ...

  5. Tomcat 之session 持久化1

    Tomcat 之session 持久化原理 几个概念: Manager 接口,其实就是指的是对  其Sesison 的管理, 其默认实现是StandardManager (内部没有任何Store对象实 ...

  6. tomcat架构分析 (Session管理)

    Session管理是JavaEE容器比较重要的一部分,在app中也经常会用到.在开发app时,我们只是获取一个session,然后向session中存取数据,然后再销毁session.那么如何产生se ...

  7. Tomcat容器的Session管理

    Session管理是JavaEE容器比较重要的一部分,在app中也经常会用到.在开发app时,我们只是获取一个session,然后向session中存取数据,然后再销毁session.那么如何产生se ...

  8. Tomcat 中的 Session 和 Cookie

    HTTP 是一种无状态通信协议,每个请求之间相互独立,服务器不能识别曾经来过的请求.而对于 Web 应用,它的活动都是依赖某个状态的,比如用户登录,此时使用 HTTP 就需要它在一次登录请求后,有为后 ...

  9. 三大框架 之 Hibernate生成策略与缓存策略(主键生成策略、持久化、持久化类划分、一级缓存、事物管理)

    目录 Hibernate生成策略与缓存策略 主键生成策略 主键分类 主键的生成策略 持久化 什么是持久化 什么是持久化类 持久化类编写规则 持久化类的划分 三种状态区分 持久态对象特征 一级缓存 什么 ...

随机推荐

  1. jQuery和Vue的区别

    1.jQuery和Vue的区别 jQuery是使用选择器($)选取DOM对象,对其进行赋值.取值.事件绑定等操作,其实和原生的HTML的区别只在于可以更方便的选取和操作DOM对象,而数据和界面是在一起 ...

  2. springboot秒杀课程学习整理1-3

    1)实现手机验证码功能,用户注册功能,用户登入功能(这里讲开发流程,及本人遇到的问题,具体实现请看代码) 1.拦截请求,获取请求参数(这里的consumes是个常量,可以定义在baseControll ...

  3. IntelliJ IDEA 安装和破解教程

    1.首先下载IntelliJ IDEA,下载链接:http://www.jetbrains.com/idea/download/#section=windows:记得一定要选择UItimate版! 2 ...

  4. flask 第四章 偏函数 Local空间转时间 myLocalStack RunFlask+request 请求上下文

    1 . 偏函数 (partial) from functools import partial def func(*args,**kwargs): a=args b=kwargs return a,b ...

  5. [转] How Bill Gates read books

    Bill Gates is one of the most famous figures in the business world. He is one of the richest men in ...

  6. sql排列组合

    一个表中4条记录,如何查询所有可能组成的结果. 例如: 1  2  3  4 四条记录,最后组成(12),(13),(14),(23),(24),(34) 最后sql如下: SELECT a.name ...

  7. idea的一般使用和初始配置

    ----- idea的一般使用和配置 1.java的类注释及方法注释 :https://blog.csdn.net/sikefeng/article/details/80557265 类注释模板 /* ...

  8. dev控件 xtraTabbedMdiManager 如何将关闭子窗体改为收回主窗体内

    前言 本文主要讲解 xtraTabbedMdiManager 如何将关闭子窗体改为收回主窗体内,顺便附上Float(浮动)的时候使窗体最大化,及指定只能某一个子窗体能浮动放大. 下面进入正题. 一.首 ...

  9. 漫谈hashcode

    概要 对于hashcode,相信很多朋友都不陌生,应为我们很多时候都需要用到这个,比如hashMap中就用到了,根据key的hash值来决定value存放的位置,之后来取得时候直接到指定的位置上那就行 ...

  10. 记录前台js判断,如果为空,給议空的占位

    这个主要是根据所有的值,按顺序输出,如果没有值,就给予空的占位, //页面加载的时候获取左边和右边的所有游客id       var array_left_start = new Array();   ...