java session使用_spring-session用mysql实现session共享实践

上一篇,写了篇文章,介绍了spring-session使用redis存储实现session共享的内部机制,

遇到很多人提问到jdbc的实现或者为什么只有理论没有实践?索性就实践一下jdbc方式。

1.spring-session实现了使用不同存储介质保存共享的session的api

spring-session实现session共享的实现有三种:

jdbc:使用数据库做介质,支持多种数据,如oracle,sqlserver,mysql等,对应的实现类

RedisOperationsSessionRepository
2d465f36b1537ce4a3459459346aa730.png

redis:使用redis做存储介质,对应的实现类为:

JdbcOperationsSessionRepository

Hazelcast:使用内存做存储介质,对应的实现类为:

HazelcastSessionRepository

Hazelcast作为一个高度可扩展的数据分发和集群平台,提供了高效的、可扩展的分布式数据存储、数据缓存。Hazelcast是开源的,在分布式技术方面,Hazelcast提供了十分友好的接口供开发者选择,如Map,Queue,ExecutorService, Lock和Jcache。

Hazelcast的稳定性很高,分布式应用可以使用Hazelcast进行存储数据、同步数据、发布订阅消息等。Hazelcast是基于Java开发的,其客户端有Java, C/C++, .NET以及REST。Hazelcast同时也支持memcache协议。它很好的支持了Hibernate,可以很容易的在当今流行的数据库系统中应用。

2.spring-session-jdbc使用mysql保存共享session的实现实践

2.0 准备工作

如所示,找到schema-mysql.sql脚本,放入sql-client客户端执行,如sqlyog,红色部分是我自己添加的,为了可以重复执行的。

DROP TABLE IF EXISTS SPRING_SESSION_ATTRIBUTES;DROP TABLE IF EXISTS SPRING_SESSION;CREATE TABLE SPRING_SESSION ( PRIMARY_ID CHAR(36) NOT NULL, SESSION_ID CHAR(36) NOT NULL, CREATION_TIME BIGINT NOT NULL, LAST_ACCESS_TIME BIGINT NOT NULL, MAX_INACTIVE_INTERVAL INT NOT NULL, EXPIRY_TIME BIGINT NOT NULL, PRINCIPAL_NAME VARCHAR(100), CONSTRAINT SPRING_SESSION_PK PRIMARY KEY (PRIMARY_ID)) ENGINE=INNODB ROW_FORMAT=DYNAMIC;CREATE UNIQUE INDEX SPRING_SESSION_IX1 ON SPRING_SESSION (SESSION_ID);CREATE INDEX SPRING_SESSION_IX2 ON SPRING_SESSION (EXPIRY_TIME);CREATE INDEX SPRING_SESSION_IX3 ON SPRING_SESSION (PRINCIPAL_NAME);CREATE TABLE SPRING_SESSION_ATTRIBUTES ( SESSION_PRIMARY_ID CHAR(36) NOT NULL, ATTRIBUTE_NAME VARCHAR(200) NOT NULL, ATTRIBUTE_BYTES BLOB NOT NULL, CONSTRAINT SPRING_SESSION_ATTRIBUTES_PK PRIMARY KEY (SESSION_PRIMARY_ID, ATTRIBUTE_NAME), CONSTRAINT SPRING_SESSION_ATTRIBUTES_FK FOREIGN KEY (SESSION_PRIMARY_ID) REFERENCES SPRING_SESSION(PRIMARY_ID) ON DELETE CASCADE) ENGINE=INNODB ROW_FORMAT=DYNAMIC;

此时创建了两张表

SPRING_SESSION

SPRING_SESSION_ATTRIBUTES

通过PRIMARY_ID关联,执行结果如下:

d12f2766839ed11bba230d847837b49c.png

2.1 使用sts创建spring-boot项目,项目名称session-jdbc,使用jdbc,mysql,web(方便测试)的start,创建完项目如下:

68e6e958b72bd21334c37d0db3e09559.png

2.2 添加spring-session-jdbc依赖

 org.springframework.session spring-session-jdbc 

2.3 配置jdbc属性application.properties

spring.session.store-type=JDBCspring.datasource.url=jdbc:mysql://localhost:3306/www?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=falsespring.datasource.username=rootspring.datasource.password=wangwei456spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.session.jdbc.cleanup-cron=0 * * * * *

注意,新版mysql的url需要增加

serverTimezone选项

而且,driver-class-name也变为com.mysql.cj.jdbc.Driver,否则有报警。

2.4 创建测试controller

package com.example.demo;import javax.servlet.http.HttpSession;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestController@RequestMapping("/jdbc")public class TestController { @RequestMapping("/welcome") public String welcome(HttpSession httpSession) { httpSession.setAttribute("hello
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值