1. 程式人生 > >Spring-Session配置,底層資料庫使用Redis或Mysql

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 -->

        <dependency>
            <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配置底層資料庫使用RedisMysql

  問題:   之前做專案的專案經理,分配了一個研究任務“在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的主從複製和高可用、叢集以及用redismysql快取

一、redis的安裝先在下載安裝包解壓後進入目錄應為已經有Makefile了所以直接make編譯這裡會報錯,需要gcc編譯器安裝好gcc,再次make編譯,還是會報錯;這個錯誤根據 Readme 可知需要執行 make MALLOC=libcmake完成後,提示去到 src

Python中實現驗證資料庫redismysql 中的賬號密碼

# _*_ 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儲存sessionredis主從配置

redis慢查詢日誌 和mysql一樣redis也有慢查詢日誌,redis的慢查詢日誌預設是開啟的。針對慢查詢日誌,主要是設定兩個引數,一個是執行時長,單位是微秒,另一個是慢查詢日誌的長度。當一個新的命令被寫入日誌時,最老的一條會從命令日誌佇列中被移除。 編輯配置檔案,檔案中搜素slowlog,可以設

spring事務管理基於xml配置完成事務回滾;spring資料庫表中欄位名和pojo中屬性名不一致時候實現RowMapper介面手動封裝

宣告使用JDK8,spring5.0.7, 測試說明: service 層 宣告介面進行轉賬,從A轉賬B ,然後對AB 進行更新操作,在事務中對find方法開啟 只讀許可權,無法進行更新操作,造成事務回滾進行測試事務; 主要測試方法:* void tra