PoEAA ch17 Database Session State
Database Session State
Stores session data as committed data in the database.
【補】語彙
How It Works
- リクエストのたび、必要なセッションデータをDBから取得
- 検索用のセッションIDは最低限クライアント側で持つ必要がある
- 取得するデータ
- セッションデータ
- 関連するレコードデータ
- セッションデータとレコードデータは区別したい
- 例: 注文
- 日次売上に、未完の注文が反映されてほしくない
- 完了した注文と区別したい
- 例: 注文
- どう区別する
- セッションデータ区別用のカラムを追加する
- どんなの
isPending: boolean
sessionID
- こちらのほうが良い
- 侵略的なアプローチ
- 既存のクエリへの変更が必要
WHERE sessionID IS NOT NULL
句を追加する- 当該テーブルにアクセスする全アプリケーションに跳ねる
- Viewで隠すことで回避できる
- コストかかる
- 既存のクエリへの変更が必要
- どんなの
- セッション管理用テーブルを分割する
PendingOrders
とか- 【補】リレーショナルモデル的にはこちらが正しいあり方だと思う
- isPendingにNULLが入った時点で、第一正規形ですらないんですよ
- 【補】リレーショナルモデル的にはこちらが正しいあり方だと思う
- 侵略的でない
- 【補】もとのレコードデータのテーブルには一切手を加えない
- O/Rマッピングコードに手を入れる必要がある
- 【補】Data Mapperとか
- OrderとOrderLineを取ってくるコード
- PendingOrderとPendingOrderLineを取ってくるコード
- 【補】Data Mapperとか
- レコードデータとセッションデータとで、データチェックのロジックは必ずしも一致しないことに留意する
- 一貫性
- バリデーション
- sessionIDカラムの追加を除き、レコードデータのテーブルと同じテーブル定義にするとよい
- セッションデータ区別用のカラムを追加する
- セッションのキャンセル/離脱時に掃除が必要
- キャンセル: セッションIDで検索して削除
- 離脱: 古いやつを削除するdaemon
- セッションテーブルは「最終更新時刻」を持っている必要がある
- ビジネストランザクションのロールバックは複雑
- 例: セッションの中で、既存の注文データに変更を加えようとし、やはり変更をキャンセルした場合
- そもそもこの種のキャンセルを許さない案
- レコードテーブルの既存の注文データを直接updateする
- この種のキャンセルをサポートする場合
- セッションテーブルを分割する場合
- 注文データをレコードテーブルからセッションテーブルに読み出す
- 変更する
- ビジネストランザクション完了時に、セッションテーブルからレコードテーブルに書き戻す
- レコードテーブルにsessionIDカラムを追加する場合
- セッションの最中は、同一の
order_id
をもつ行が複数存在することになる- レコードデータ
- セッションデータ
order_id
はそれ単体でPKにできないことになる- 複雑
- セッションの最中は、同一の
- セッションテーブルを分割する場合
- セッションテーブルを分割する場合は、Serialized LOBの適用も検討する
- 【補】レコードデータのテーブルのテーブル定義を模さず、1つのLOBカラムとして突っ込む
- もはやServer Session Stateパターン
- セッションデータを区別しないという選択肢
When to Use It
- Server Session State, Client Session Stateパターンとの比較
- パフォーマンス
- 実装面の労力
- 大半はレコードデータとセッションデータとを区別するためのもの
- リクエスト毎にレコードデータを直接更新していいなら、労力はほとんどない
- Server Session State vs. Database Session State
- クラスタリング・failoverをサポートする場合、Database Session Stateが素直
英語
- invasive
- invade派生
- 侵略的