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本身是一個非關係型數據庫,可以存儲一切的實體對象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章