2011年12月16日 星期五

把 Session 寫入資料庫的方法:Session Persistent

目前的需求是要 web application 被重新 deploy 的時候,使用者必須能保留 session
原本在找用 session migration 把 session 遷移出去,deploy 完成後再遷移回來
不過後來找到比較簡單的方式,可以直接即時把 session 寫進資料庫
deploy 完成後 tomcat 會自動把 session 再抓出來。

參考資料:Tomcat 6 Session Persistence through JDBCStore


資料庫:

create table sessions (
session_id     varchar(100) not null primary key,
valid_session  char(1) not null,
max_inactive   int not null,
last_access    bigint not null,
app_name       varchar(255),
session_data   mediumblob,
KEY kapp_name(app_name)
);

大體上我的設定方法就跟上面差不多,不過有一點點小小的差異:

1、
{tomcat}/conf/catalina.properties 設定我這邊必須加上

org.apache.catalina.session.StandardSession.ACTIVITY_CHECK=true
org.apache.catalina.STRICT_SERVLET_COMPLIANCE=true

官方文件是說只加兩個的任一個就可以,不過我只加第一個時沒有效果。

2、
我設定的 context.xml ({tomcat}/conf/context.xml)

<Manager className="org.apache.catalina.session.PersistentManager"
 saveOnRestart="true" minIdelSwap="-1" maxIdleSwap="-1"  maxIdleBackup="3600"> 
 <Store className="org.apache.catalina.session.JDBCStore" 
  driverName="com.mysql.jdbc.Driver"
  connectionURL="jdbc:mysql://127.0.0.1:3306/table?user=user&amp;password=password" 
  sessionTable="sessions" 
  sessionIdCol="session_id"
  sessionDataCol="session_data"
  sessionValidCol="valid_session" 
  sessionMaxInactiveCol="max_inactive"
  sessionLastAccessedCol="last_access"
  sessionAppCol="app_name"
  checkInterval="60" />
</Manager>

那個網址上用的設定好像會讓 session 超神速就自動 time-out
使用者一下子不動就被登出了~。
另外連接 MySQL 的字串說明如下:
jdbc:mysql://127.0.0.1:3306/table?user=user&amp;password=password
table
= 資料庫名稱
user = 登入帳號
password = 登入密碼
&amp; = 表示  "&",這是故意要用 entity 的表示方式來表達,查到一些資料是說如果在 Java 裡使用的話直接用 & 即可,但寫在 XML 裡面必須轉換成 entity

相關資源:
1、HTML 4.0 Special Entities

2、context.xml 設定的官方文件

目前正在測試使用狀況,大體上看來好像是能達到目的。

沒有留言: