Seasar DI Container with AOP

本ドキュメントはS2.4.13について記述しています.旧バージョンについては該当バージョンの配布ファイルに含まれているドキュメントを参照してください.

DBセッションレプリケーションを使って、HttpSessionのレプリケーションを実現できます。 その際にアプリケーションサーバのセッション機能は利用しません。 クラスタリングをサポートしていないアプリケーションサーバを使って、 セッションレプリケーションを実現できるのです。 セッション情報はデータベースに書き出されます。 レプリケーションを使わない場合でも、メモリを節約する効果もあります。

セッションタイムアウトは現在実装されていないため、セッションデータの削除は、 個別に実装する必要があります。 その際、最後にアクセスした日時をLAST_ACCESSカラムで知ることができます。

セットアップ

セッション情報は、できる限り速度の速いデータベースに書き込んでください。 インメモリデータベースなどを使うことを推奨します。

dbsession.dicon

Seasar2の配布ファイル (S2.4.xx.zip) のresources/dbsession.diconをクラスパスに通します。 dbsession.diconのDbSessionStateManagerImplのdataSourceプロパティを適切に設定します。 dbsession.diconを、app.diconでincludeします。

セッション情報の値はバイトストリームとしてバッチ更新によりデータベースに書き込まれますが、 RDBMSによってはバイトストリームを含む行のバッチ更新に制限があります。 その場合、DbSessionStateManagerImplのbatchUpdateDisabledプロパティにtrueを設定し、 バッチ更新を利用しないようにしてください。 現在、バイトストリームを含む行のバッチ更新に制限があると判明しているRDBMSには 以下のものがあります。

  • Oracle Database 9i (ただし、9iのバージョンによってはこの対応が不要なものもあるかもしれません)

テーブル定義

定義したデータソースにテーブル定義を追加します。 テーブル定義は使用するRDBMSごとに若干異なります

HSQLDBを使用する場合次のように定義します。

CREATE MEMORY TABLE S2SESSION(
  SESSION_ID VARCHAR NOT NULL,
  NAME VARCHAR(255) NOT NULL,
  VALUE VARBINARY(10485760),
  LAST_ACCESS TIMESTAMP,
  PRIMARY KEY(SESSION_ID,NAME))

Oracle Database 10g、DB2を使用する場合次のように定義します。

CREATE MEMORY TABLE S2SESSION(
  SESSION_ID VARCHAR(255) NOT NULL,
  NAME VARCHAR(255) NOT NULL,
  VALUE BLOB,
  LAST_ACCESS TIMESTAMP,
  PRIMARY KEY(SESSION_ID,NAME))

Oracle Database 9iを使用する場合次のように定義します (ただし、9iのバージョンによっては10gと同じ定義で動作するかもしれません)。

CREATE MEMORY TABLE S2SESSION(
  SESSION_ID VARCHAR(255) NOT NULL,
  NAME VARCHAR(255) NOT NULL,
  VALUE LONG RAW,
  LAST_ACCESS TIMESTAMP,
  PRIMARY KEY(SESSION_ID,NAME))

Servlet Filter

web.xmlに次のようにfilterの設定を追加します。 DbSessionFilterはfilterの中で最初に記述してください。

<filter>
    <filter-name>dbSessionFilter</filter-name>
    <filter-class>org.seasar.extension.httpsession.SessionFilter</filter-class>

    <!-- セッションIDを保存するクッキーの名前 (デフォルトは "S2SESSIONID") -->
    <init-param>
        <param-name>cookieName</param-name>
        <param-value>MYSESSIONID</param-value>
    </init-param>
    <!-- セッションIDを保存するクッキーの有効期限 (秒単位、デフォルトは -1) -->
    <init-param>
        <param-name>cookieMaxAge</param-name>
        <param-value>3600</param-value>
    </init-param>
    <!-- セッションIDを保存するクッキーのパス (デフォルトはコンテキストパスまたは "/") -->
    <init-param>
        <param-name>cookiePath</param-name>
        <param-value>/</param-value>
    </init-param>
    <!-- セッションIDを保存するクッキーのセキュア属性 (デフォルトは false) -->
    <init-param>
        <param-name>cookieSecure</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>dbSessionFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>