Spring-Session配置,底层数据库使用Redis或Mysql
来源:互联网 发布:耽美网络剧资源百度云 编辑:程序博客网 时间:2024/06/02 02:39
问题:
之前做项目的项目经理,分配了一个研究任务“在Maven驱动的项目中,配置使用Spring Session,同时底层存储使用Mysql。”
关于Spring-session的详细介绍;Spring-Session相较于传统的HttpSession的优点。
请参考:http://www.infoq.com/cn/articles/Next-Generation-Session-Management-with-Spring-Session
这篇文章来自于InofQ网站,总结全面、清晰。
解决方案:
(1)配置使用Spring Session,同时底层存储使用Redis
由于Spring Session默认采用Redis进行数据存储,配置比较容易。
详细步骤参考:http://www.bubufx.com/detail-1497535.html
实际测试过,配置过后项目可以使用Spring-Session,同时底层存储使用Redis。
(2)配置使用Spring Session,同时底层存储使用Mysql
Step1:
默认情况下,这个sessionRepository实例将会使用
SPRING_SESSION
SPRING_SESSION_ATTRIBUTES
两个表去存储session。
除此之外,我们也可以使用setTableName(String)方法,自定义我们要使用的表,然后存储seesion相关属性(Session's ATTRIBUTES)的表
会被前面自定义的表名,添加上后缀_ATTRIBUTES,作为存储session属性的表名称。
默认情况下,SPRING_SESSION和SPRING_SESSION_ATTRIBUTES两个表的定义如下:
--------begin---------
CREATE TABLE SPRING_SESSION (
SESSION_ID CHAR(36),
CREATION_TIME BIGINT NOT NULL,
LAST_ACCESS_TIME BIGINT NOT NULL,
MAX_INACTIVE_INTERVAL INT NOT NULL,
PRINCIPAL_NAME VARCHAR(100),
CONSTRAINT SPRING_SESSION_PK PRIMARY KEY (SESSION_ID)
);
CREATE INDEX SPRING_SESSION_IX1 ON SPRING_SESSION (LAST_ACCESS_TIME);//添加索引
CREATE TABLE SPRING_SESSION_ATTRIBUTES (
SESSION_ID CHAR(36),
ATTRIBUTE_NAME VARCHAR(200),
ATTRIBUTE_BYTES BYTEA,
CONSTRAINT SPRING_SESSION_ATTRIBUTES_PK PRIMARY KEY (SESSION_ID, ATTRIBUTE_NAME),
CONSTRAINT SPRING_SESSION_ATTRIBUTES_FK FOREIGN KEY (SESSION_ID) REFERENCES SPRING_SESSION(SESSION_ID) ON DELETE CASCADE
);
CREATE INDEX SPRING_SESSION_ATTRIBUTES_IX1 ON SPRING_SESSION_ATTRIBUTES (SESSION_ID);//添加索引
--------end---------
Step2:
<groupId>org.springframework.session</groupId>
<artifactId>spring-session</artifactId>
<version>${spring-session.version}</version>
在项目中的src/main/resources文件夹下,创建Spring-Session.xml文件,在此文件中配置包含SpringSession相关操作的bean。
Step4:
至此配置完成,问题得到了完美的解决!
之前做项目的项目经理,分配了一个研究任务“在Maven驱动的项目中,配置使用Spring Session,同时底层存储使用Mysql。”
关于Spring-session的详细介绍;Spring-Session相较于传统的HttpSession的优点。
请参考:http://www.infoq.com/cn/articles/Next-Generation-Session-Management-with-Spring-Session
这篇文章来自于InofQ网站,总结全面、清晰。
解决方案:
(1)配置使用Spring Session,同时底层存储使用Redis
由于Spring Session默认采用Redis进行数据存储,配置比较容易。
详细步骤参考:http://www.bubufx.com/detail-1497535.html
实际测试过,配置过后项目可以使用Spring-Session,同时底层存储使用Redis。
(2)配置使用Spring Session,同时底层存储使用Mysql
Step1:
默认情况下,这个sessionRepository实例将会使用
SPRING_SESSION
SPRING_SESSION_ATTRIBUTES
两个表去存储session。
除此之外,我们也可以使用setTableName(String)方法,自定义我们要使用的表,然后存储seesion相关属性(Session's ATTRIBUTES)的表
会被前面自定义的表名,添加上后缀_ATTRIBUTES,作为存储session属性的表名称。
默认情况下,SPRING_SESSION和SPRING_SESSION_ATTRIBUTES两个表的定义如下:
--------begin---------
CREATE TABLE SPRING_SESSION (
SESSION_ID CHAR(36),
CREATION_TIME BIGINT NOT NULL,
LAST_ACCESS_TIME BIGINT NOT NULL,
MAX_INACTIVE_INTERVAL INT NOT NULL,
PRINCIPAL_NAME VARCHAR(100),
CONSTRAINT SPRING_SESSION_PK PRIMARY KEY (SESSION_ID)
);
CREATE INDEX SPRING_SESSION_IX1 ON SPRING_SESSION (LAST_ACCESS_TIME);//添加索引
CREATE TABLE SPRING_SESSION_ATTRIBUTES (
SESSION_ID CHAR(36),
ATTRIBUTE_NAME VARCHAR(200),
ATTRIBUTE_BYTES BYTEA,
CONSTRAINT SPRING_SESSION_ATTRIBUTES_PK PRIMARY KEY (SESSION_ID, ATTRIBUTE_NAME),
CONSTRAINT SPRING_SESSION_ATTRIBUTES_FK FOREIGN KEY (SESSION_ID) REFERENCES SPRING_SESSION(SESSION_ID) ON DELETE CASCADE
);
CREATE INDEX SPRING_SESSION_ATTRIBUTES_IX1 ON SPRING_SESSION_ATTRIBUTES (SESSION_ID);//添加索引
--------end---------
Step2:
在pom.xml文件中添加对Spring-Session的依赖(项目是由Maven驱动的)。
关键代码如下:
<!-- 相关常量的配置 -->
<properties>
<spring-session.version>1.2.1.RELEASE</spring-session.version>
</properties>
<!-- Spring Session依赖 begin -->
<groupId>org.springframework.session</groupId>
<artifactId>spring-session</artifactId>
<version>${spring-session.version}</version>
</dependency>
<!-- Spring Session依赖 end -->
Step3:在项目中的src/main/resources文件夹下,创建Spring-Session.xml文件,在此文件中配置包含SpringSession相关操作的bean。
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:jdbc="http://www.springframework.org/schema/jdbc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd"><!-- Spring Session 配置 start--><context:annotation-config/><bean class="org.springframework.session.jdbc.config.annotation.web.http.JdbcHttpSessionConfiguration"/><bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><constructor-arg ref="dataSource"/></bean><!-- Spring Session 配置 end--></beans>
说明:上面文件中配置第二个bean的时候使用到了ref="dataSource",而这个id="dataSource"的bean的配置,在项目中的Spring-config.xml文件中:
<!-- 加载资源文件 start--> <!--其中包含变量信息,必须在Spring配置文件的最前面加载,即第一个加载--> <context:property-placeholder location="classpath:<span style="color:#FF0000;">persistence-mysql.properties</span>"/> <!-- 加载资源文件 end--> <!--spring jdbc数据源 start--> <!--<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="${jdbc.driverClassName}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.user}" /> <property name="password" value="${jdbc.pass}" /> </bean>--> <!--spring jdbc数据源 end--> <!-- druid数据源 start--> <bean <span style="color:#FF0000;">id="dataSource"</span> class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <!-- 基本属性 url、user、password --> <property name="url" value="<span style="color:#FF0000;">${jdbc.url}</span>"/> <property name="username" value="<span style="color:#FF0000;">${jdbc.user}</span>"/> <property name="password" value="<span style="color:#FF0000;">${jdbc.pass}</span>"/> <property name="driverClassName" value="<span style="color:#FF0000;">${jdbc.driverClassName}</span>"/> <!-- 配置初始化大小、最小、最大 --> <property name="initialSize" value="10"/> <property name="minIdle" value="1"/> <property name="maxActive" value="20"/> <!-- 配置获取连接等待超时的时间 --> <property name="maxWait" value="60000"/> <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="60000"/> <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="300000"/> <property name="validationQuery" value="SELECT 'x'"/> <property name="testWhileIdle" value="true"/> <property name="testOnBorrow" value="false"/> <property name="testOnReturn" value="false"/> <!-- 打开PSCache,并且指定每个连接上PSCache的大小 --> <property name="poolPreparedStatements" value="true"/> <property name="maxPoolPreparedStatementPerConnectionSize" value="20"/> <!-- 配置监控统计拦截的filters,去掉后监控界面sql无法统计 --> <property name="filters" value="stat"/> </bean> <!-- druid数据源 end--> <bean id="dataSourceProxy" class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy"> <property name="targetDataSource" ref="dataSource"/> </bean>说明:加载时,使用的连接JDBC的相关配置信息,在文件
<span style="color:#FF0000;">persistence-mysql.properties</span>配置。这个文件也被放在src/main/resources文件夹。
# jdbc.X<span style="color:#FF0000;">jdbc.driverClassName=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/fms?useUnicode=true&characterEncoding=UTF-8jdbc.user=rootjdbc.pass=123456</span># hibernate.X#hibernate.connection.driverClass=org.gjt.mm.mysql.Driver#hibernate.connection.url=jdbc:mysql://localhost:3306/test#hibernate.dialect=org.hibernate.dialect.MySQL5Dialect#hibernate.connection.username=root#hibernate.connection.password=roothibernate.show_sql=truehibernate.hbm2ddl.auto=updatehibernate.format_sql=truehibernate.ejb.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategydatabasePlatform=org.hibernate.dialect.MySQLDialect#hibernate configurehibernate.query.substitutions=true 1, false 0hibernate.default_batch_fetch_size=20hibernate.max_fetch_depth=2hibernate.bytecode.use_reflection_optimizer=truehibernate.cache.use_second_level_cache=truehibernate.cache.use_query_cache=truehibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactorynet.sf.ehcache.configurationResourceName=ehcache_hibernate.xmlhibernate.cache.use_structured_entries=truehibernate.generate_statistics=false
Step4:
在web.xml文件中配置filter,拦截所有的请求。让之前配置的SpringSession发挥魔力,真正地起作用。
<!-- Spring-session 拦截器 begin--><filter><filter-name>springSessionRepositoryFilter</filter-name><filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class></filter><filter-mapping><filter-name>springSessionRepositoryFilter</filter-name><url-pattern>/*</url-pattern><dispatcher>REQUEST</dispatcher> <dispatcher>ERROR</dispatcher></filter-mapping><!-- Spring-session 拦截器 end-->
至此配置完成,问题得到了完美的解决!
思维拓展:谈谈配置Spring-Session底层数据库使用Redis和Mysql之间的区别?
答:关键区别在于:当底层使用Mysql的时候,在数据库新增了两张用于存储Spring Session相关信息的表格(table)。而Redis则不需要,因为Redis本身是一个非关系型数据库,可以存储一切的实体对象。
2 0
- Spring-Session配置,底层数据库使用Redis或Mysql
- spring-session使用配置redis
- spring session redis 配置
- Laravel 下配置缓存、Session 使用不同的 Redis 数据库
- 使用Spring Session和Redis管理session
- 使用spring session存储session到redis
- 使用Spring Session redis进行Session共享
- 使用Spring Session和Redis管理session
- 使用spring session redis做session共享
- Laravel 下配置 Redis 让缓存、Session 各自使用不同的 Redis 数据库
- Laravel 下配置 Redis 让缓存、Session 各自使用不同的 Redis 数据库
- Laravel 下配置 Redis 让缓存、Session 各自使用不同的 Redis 数据库
- Laravel 下配置 Redis 让缓存、Session 各自使用不同的 Redis 数据库
- 基于redis的Spring session配置
- spring-session redis集群配置步骤总结
- spring使用xml配置mysql,mongodb,redis,activemq
- Spring MVC 使用 Spring Session 实现 Session 共享-Redis
- Spring配置mysql数据库
- babel无法解析es5、jsx
- android开关控件使用(一)
- 读《About Face 4 交互设计精髓》15
- post 请求与get请求的区别?
- 依赖属性与Binding
- Spring-Session配置,底层数据库使用Redis或Mysql
- 50.Product of Array Exclude Itself-数组剔除元素后的乘积(容易题)
- php模板引擎smaty之介绍
- 自定义Dialog
- 文章标题
- javascript_解析json对象
- Happy Number
- 关于Ubuntu安装java设置环境变量的问题
- 牛客网答题笔记--构造队列