0. はじめに
Spring Sessionお試し用Webアプリはこちらで公開しています。
本記事で解説している手順を実施した後に、
Webアプリを起動させて
ブラウザから、/sessionDemoにアクセスすると
Db2上のテーブルにSession情報が永続化されます。
1. 導入 〜 Spring Sessionの魅力 〜
「使った分だけ課金」ポリシーのクラウドサービスが多い昨今は
「立ち上がりっぱなし」転じて
「On-Memoryに状態を保持しっぱなし」Webアプリだと肩身が狭い。
- 持て余しているリソース(CPU、Memory etc...)は、欲しい人に譲りたい。
- 処理要求が無いのなら、休眠していて欲しい。
とはいえ、ステートフルにデータを扱いたい場合もあるので
休眠させるにしても、アレコレ検討が必要。
例えば、ログイン完了した後に、データ色々と持ち回りたいケース等。
つまり、クラウドNativeなWebアプリに望まれる要件は以下。
- 処理が無いなら、休眠していて欲しい。
- 休眠の前は、何処ぞにSessionデータ残したい。
- 休眠が明けたら、以前のようにSessionデータ扱いたい。
労せずして、なんとか出来ませんかねぇ?
この種の悩みに答えてくれる機能が
Spring Frameworkの世界では、あらかじめ用意されている様子。
その名も、Spring Sessionと言うらしい。ちょっと学んでみました。
第0回目は、環境セットアップ方法の纏めです。
2. Dockerインストール
Docker公式HP からダウンロードできます。
お使いのOSに合わせて導入ください。
3. Db2 Express-C Dockerイメージpull & 起動
Spring Sessionで、Sessionを永続化する先の環境セットアップです。
今回は、RDBMS製品として
IBM社のDb2 Express-Cを使います。
以下コマンドで、Dockerイメージをダウンロードしつつ
ポート番号・パスワード・DB名など指定して起動させます。
$ docker run -itd --name mydb2 --privileged=true -p 50000:50000 -e LICENSE=accept -e DB2INST1_PASSWORD=p@ssw0rd -e DBNAME=testdb -v [Dockerホスト側path]/database:/database ibmcom/db2
ついでに、Db2表領域をコンテナから外出しする用途で
Dockerホスト側のdirをマウントさせています。
コマンド内「Dockerホスト側path」を適宜、書き換えください。
その他、docker runオプション仔細は、公式マニュアルご参照。
4. Db2稼働確認 & ログイン
正しく立ち上がっていれば
STATUS:Upになります。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cb23f39d4164 ibmcom/db2 "/var/db2_setup/lib/…" 45 hours ago Up 47 seconds 22/tcp, 55000/tcp, 60006-60007/tcp, 0.0.0.0:50000->50000/tcp mydb2
$
テーブルは何も無いことを確認。
$ docker exec -it mydb2 bash
[root@cb23f39d4164 /]# su - db2inst1
[db2inst1@cb23f39d4164 ~]$ db2 connect to testdb user db2inst1
db2 => list tables
Table/View Schema Type Creation time
------------------------------- --------------- ----- --------------------------
0 record(s) selected.
db2 => quit
[db2inst1@cb23f39d4164 ~]$
5. Spring Session データ永続先テーブル作成
Spring Session 公式でSQLファイル配布してるので、ダウンロードして実行します。
以下、作業例のとおり
docker runで指定した、ホスト側dirに配置しておくと楽です。
[db2inst1@cb23f39d4164 ~]$ db2 -tvf /database/sql/schema-db2.sql
CREATE TABLE SPRING_SESSION ( PRIMARY_ID CHAR(36) NOT NULL, SESSION_ID CHAR(36) NOT NULL, CREATION_TIME BIGINT NOT NULL, LAST_ACCESS_TIME BIGINT NOT NULL, MAX_INACTIVE_INTERVAL INT NOT NULL, EXPIRY_TIME BIGINT NOT NULL, PRINCIPAL_NAME VARCHAR(100), CONSTRAINT SPRING_SESSION_PK PRIMARY KEY (PRIMARY_ID) )
DB20000I The SQL command completed successfully.
CREATE UNIQUE INDEX SPRING_SESSION_IX1 ON SPRING_SESSION (SESSION_ID)
DB20000I The SQL command completed successfully.
CREATE INDEX SPRING_SESSION_IX2 ON SPRING_SESSION (EXPIRY_TIME)
DB20000I The SQL command completed successfully.
CREATE INDEX SPRING_SESSION_IX3 ON SPRING_SESSION (PRINCIPAL_NAME)
DB20000I The SQL command completed successfully.
CREATE TABLE SPRING_SESSION_ATTRIBUTES ( SESSION_PRIMARY_ID CHAR(36) NOT NULL, ATTRIBUTE_NAME VARCHAR(200) NOT NULL, ATTRIBUTE_BYTES BLOB NOT NULL, CONSTRAINT SPRING_SESSION_ATTRIBUTES_PK PRIMARY KEY (SESSION_PRIMARY_ID, ATTRIBUTE_NAME), CONSTRAINT SPRING_SESSION_ATTRIBUTES_FK FOREIGN KEY (SESSION_PRIMARY_ID) REFERENCES SPRING_SESSION(PRIMARY_ID) ON DELETE CASCADE )
DB20000I The SQL command completed successfully.
[db2inst1@cb23f39d4164 ~]$
6. Spring InitializrでProject定義 & IDEでImport
Spring Initializrはこちら、ですが...
お試しWebアプリ用のProjectに pom.xml を付けたので割愛。
pom.xmlの、主要な箇所は以下です。
#Spring Session本体
spring-session-core
spring-session-jdbc
#お試しWebアプリ用
spring-boot-starter-web
#db2接続の前提
jcc
HikariCP
だいぶ長くなりましたが、環境まわりセットアップは以上です。
7. Spring Session基本設定
まずapplication.propertiesに適宜、定義します。
主要バラメータのみ抜粋。
仔細はapplication.propertiesの各Commentご参照。
spring.session.store-type=jdbc
spring.session.jdbc.flush-mode=immediate
spring.session.jdbc.initialize-schema=never
server.servlet.session.timeout=30s
spring.session.jdbc.table-name=SPRING_SESSION
spring.session.jdbc.save-mode=always
spring.datasource.*
続いて、@EnableJdbcHttpSessionを使ってConfigクラスを用意。
@EnableJdbcHttpSession
public class HttpSessionConfig {
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
通常のSpring Webアプリと異なる箇所は、以上です。
8.終わりに
第0回は、環境セットアップ周りを中心に解説させて頂きました。
次回は、お試し用Webアプリの挙動を交えつつ、Spring Sessionを紹介する予定。
乞うご期待です。