Spring-Session配置,底層資料庫使用Redis或Mysql
之前做專案的專案經理,分配了一個研究任務“在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.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://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.Driver
jdbc.url=jdbc:mysql://localhost:3306/fms?useUnicode=true&characterEncoding=UTF-8
jdbc.user=root
jdbc.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=root
hibernate.show_sql=true
hibernate.hbm2ddl.auto=update
hibernate.format_sql=true
hibernate.ejb.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy
databasePlatform=org.hibernate.dialect.MySQLDialect
#hibernate configure
hibernate.query.substitutions=true 1, false 0
hibernate.default_batch_fetch_size=20
hibernate.max_fetch_depth=2
hibernate.bytecode.use_reflection_optimizer=true
hibernate.cache.use_second_level_cache=true
hibernate.cache.use_query_cache=true
hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory
net.sf.ehcache.configurationResourceName=ehcache_hibernate.xml
hibernate.cache.use_structured_entries=true
hibernate.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本身是一個非關係型資料庫,可以儲存一切的實體物件。
相關推薦
Spring-Session配置,底層資料庫使用Redis或Mysql
問題: 之前做專案的專案經理,分配了一個研究任務“在Maven驅動的專案中,配置使用Spring Session,同時底層儲存使用Mysql。” 關於Spring-session的詳細介紹;Spring-Session相較於傳統的HttpSession的優點。
spring Boot redis連線池配置,Spring Session配置
1.POM配置 <!-- redis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifac
mybatis callSettersOnNulls 配置,解決資料庫null欄位的顯示
mybatis 的配置,解決資料庫null欄位的顯示 SQL語句可以查詢到有5個欄位的資料集 為什麼程式碼裡面卻只有四個欄位呢? mybatis sql xml 檔案就這麼寫的,沒毛病!!! select t.CATEGORY_ID as c
SpringBoot與MyBatis整合,底層資料庫為mysql的使用示例
專案下載連結:https://github.com/DFX339/bootdemo.git 新建maven專案,web專案,專案名為 bootdemo 專案結構目錄如下:還有個pom.xml檔案沒有在截圖裡面 專案需要編寫的檔案主
Grails資料來源配置,自動資料庫遷移,事物感知資料來源
你一定知道!由於Grails是基於Java技術構建的,因此設定資料來源需要一些JDBC知識(代表Java資料庫連線的技術)。 如果使用H2以外的資料庫,則需要JDBC驅動程式。例如,
spring事物配置,宣告式事務管理和基於@Transactional註解的使用
spring支援程式設計式事務管理和宣告式事務管理兩種方式。 程式設計式事務管理使用TransactionTemplate或者直接使用底層的PlatformTransactionManager。對於程式設計式事務管理,spring推薦使用Transactio
Spring Boot配置檔案properties資料庫密碼加密
Spring Boot配置檔案資料庫密碼加密 pom新增依賴 <!-- 資料庫加密 --> <dependency> &l
倒騰一下 hibernate的配置,但是資料庫連線不成功,使用的proxool連線池,報:com.mysql.cj.exceptions.WrongArgumentException: Malform
報錯資訊是:ERROR: Cannot load connection class because of underlying exception: com.mysql.cj.exceptions.WrongArgumentException: Malformed datab
spring boot之Spring session配置
一.為什麼要spring-session 在傳統單機web應用中,一般使用tomcat/jetty等web容器時,使用者的session都是由容器管理。瀏覽器使用cookie中記sessionId,容器根據sessionId判斷使用者是否存在會話session。這裡的限制是,session儲
springboot中使用spring-session實現共享會話到redis(二)
上篇文章介紹了springboot中整合spring-session實現了將session分散式存到redis中。這篇在深入介紹一些spring-session的細節。1、session超時:在tomcat中,如果要設定session的超時,我們可以在web.xml或者spr
redis安裝及配置,阿里雲redis連不通問題
一,Redis安裝 1,下載Redis wget http://download.redis.io/redis-stable.tar.gz 2,解壓 tar xzf redis-stable.tar.gz 3,進入壓縮後目錄 cd redis-stable
spring mvc配置,可以理解為對映機制,即http url和action程式碼之間的關係的配置
1web.xml配置 <servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.Di
springboot中使用spring-session實現共享會話到redis
在叢集環境中做session共享是必不可少的一步,你想想當用戶的請求經過nginx轉發到A機器進行登入,然後下一步的操作轉發到了B機器,這個時候使用者資訊是儲存在A機器上的web容器中,B機器就識別不了這個使用者,這個時候就需要做session共享了。傳統session共享解
【struts2】一個BBS論壇初步顯示sql資料庫的配置,這裡使用的是MySQL
create database bbs2009; use bbs2009; create table _category ( id int primary key auto_increment,
redis的主從複製和高可用、叢集,以及用redis做mysql快取
一、redis的安裝先在下載安裝包解壓後進入目錄應為已經有Makefile了所以直接make編譯這裡會報錯,需要gcc編譯器安裝好gcc,再次make編譯,還是會報錯;這個錯誤根據 Readme 可知需要執行 make MALLOC=libcmake完成後,提示去到 src
Python中實現驗證資料庫redis 和 mysql 中的賬號密碼
# _*_ coding:utf-8 _*_ import sys import pymysql import redis def con_mysql(sql): db = pymysql.connect( host='127.0.
springboot2整合spring-session-data-redis,實現session共享
1.新增Maven依賴 <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId>
spring jdbc --注:c3p0資料庫連線池或druid連線池使用配置整理
是Maven配置檔案:pom.xml的程式碼內容: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:sch
redis慢查詢日誌,php安裝redis擴充套件,redis儲存session,redis主從配置
redis慢查詢日誌 和mysql一樣redis也有慢查詢日誌,redis的慢查詢日誌預設是開啟的。針對慢查詢日誌,主要是設定兩個引數,一個是執行時長,單位是微秒,另一個是慢查詢日誌的長度。當一個新的命令被寫入日誌時,最老的一條會從命令日誌佇列中被移除。 編輯配置檔案,檔案中搜素slowlog,可以設
spring事務管理,基於xml配置完成事務回滾;spring中資料庫表中欄位名和pojo中屬性名不一致時候,實現RowMapper介面手動封裝
宣告使用JDK8,spring5.0.7, 測試說明: service 層 宣告介面進行轉賬,從A轉賬B ,然後對AB 進行更新操作,在事務中對find方法開啟 只讀許可權,無法進行更新操作,造成事務回滾進行測試事務; 主要測試方法:* void tra