Wicket stuff に
と
MongoDB を
インストールがMongoDBDatastore
を
StoreSettings
に
IDataStore クラスが
StoreSettings の 前に、 DataStore に ついて
Apache Wikcet 7.x ユーザガイド8章邦訳+訳注 - Qiita
に
Wicket の
第1レベルの
キャッシュ これは、 ユーザーセッションに 紐づけられた キャッシュです。
最後のリクエストで 使用された ページのみ 保存されます。
wicket/PageStoreManager.java at master · apache/wicket が実装を 保持しています。 第2レベルの
キャッシュ アプリケーションスコープ の キャッシュです。
デフォルトで、SerializedPagesCache
が使用されています。
sessionId
とpageId
をキーと して、 アプリケーションの メモリー上に キャッシュされます。
SerializedPagesCache
は、wicket/DefaultPageStore.java at master · apache/wicket
のインナークラスです。 第3レベルの
キャッシュ
このキャッシュが、 DataStore の 実装で コントロールできます。
デフォルトだと、DiskDataStore
が使われます。
第2レベルキャッシュに存在しない データも、 第3レベルの キャッシュ には 存在します。
実装としては、 以下のような 作りになっています。 - 第2レベルキャッシュにも、
第3レベルキャッシュにも、 データ保存は 試みる。 - 第2レベルキャッシュの
設定次第で、 1.
の保存時に、 設定上限を 上回った 場合は 削除される。 - コンポーネントの
unbind
時は、第2レベルキャッシュ、 第3レベルキャッシュからも データは 削除を 試みる。 2
コンポーネントのunbind
がどの タイミングで 走るのかが あまりよく わかっていないです。
- 第2レベルキャッシュにも、
この辺りの
DiskDataStore の 実装に ついて
wicket/DiskDataStore.java at master · apache/wicket
の
DiskDataStore.java
呼び/** * Construct. * * @param applicationName * @param fileStoreFolder * @param maxSizePerSession */ public DiskDataStore(final String applicationName, final File fileStoreFolder, final Bytes maxSizePerSession) { this.applicationName = applicationName; this.fileStoreFolder = fileStoreFolder; maxSizePerPageSession = Args.notNull(maxSizePerSession, "maxSizePerSession"); sessionEntryMap = new ConcurrentHashMap<>(); try { if (this.fileStoreFolder.exists() || this.fileStoreFolder.mkdirs()) { loadIndex(); } else { log.warn("Cannot create file store folder for some reason."); } } catch (SecurityException e) { throw new WicketRuntimeException( "SecurityException occurred while creating DiskDataStore. Consider using a non-disk based IDataStore implementation. " + "See org.apache.wicket.Application.setPageManagerProvider(IPageManagerProvider)", e); } }
出し先の wicket/DefaultPageManagerProvider.java at master · apache/wicket は 以下のような 実装に なっています。 DefaultPageManagerProvider.java
DiskDataStore のprotected IDataStore newDataStore() { StoreSettings storeSettings = getStoreSettings(); Bytes maxSizePerSession = storeSettings.getMaxSizePerSession(); File fileStoreFolder = storeSettings.getFileStoreFolder(); return new DiskDataStore(application.getName(), fileStoreFolder, maxSizePerSession); }
ファイル保存先は、 storeSettings.getFileStoreFolder()
の戻り値が 使われます。
デフォルトは、システムプロパティ javax.servlet.context.tempdir
で指定された 値、
設定がなければ、 File.createTempFile("file-prefix", (String)null).getParentFile()
で得られた ディレクトリが 使用されます。
DiskDataStore内のgetStoreFolder
で以下フォルダを 指定してますので、 実際には、protected File getStoreFolder() { return new File(fileStoreFolder, applicationName + "-filestore"); }
javax.servlet.context.tempdir
で指定された ディレクトリの 下に アプリケーション名 + "-filestore"
という ディレクトリ作成され、 その 配下に ページクラスが シリアライズされ、 セッションごとに 保存されていきます。
StoreSettings の 実装に ついて
上記を
メソッド名 | 内容 |
---|---|
setAsynchronous(boolean async) | 非同期で使用するか設定します。3 |
setAsynchronousQueueCapacity(int queueCapacity) | 非同期でDataStoreを使用する際のキューの容量を設定します。 |
setFileStoreFolder(File fileStoreFolder) | DiskDataStoreが保存するフォルダを設定します。4 |
setInmemoryCacheSize(int inmemoryCacheSize) | 第2レベルキャッシュに格納されるページインスタンスの最大数を設定します。 |
setMaxSizePerSession(Bytes maxSizePerSession) | DiskDataStoreに保村するセッションごとのページインスタンスが格納されるFileの最大サイズを設定します。 |
対になる
省略します。
3.True を
4.DiskDataStore でのみ
DataStore を 自前で 実装する 際の 考慮点
調べた
setFileStoreFolder に
ついて
DiskDataStore を使用する 場合のみ 使用される。 DataStore を 独自実装する 場合は、 使用する 実装にしないと 使われないので 注意。 setMaxSizePerSession に
ついて
setFileStoreFolder
と同様に、 DiskDataStore を 使用する 場合のみ 使用される。
意味的には、別の DataStore の 場合も、 データサイズ超えたら 消すなど、 使う 実装に する ことは 可能だと 思う。
なので、設定できるように すると、 「格好は 良い」かもしれない。 setInmemoryCacheSize に
ついて
第2レベルキャッシュ の設定に 関する 値なので、 DataStoreと して 何を 使っても アプリケーションには 影響する。
小さい値を 設定すれば、 DataStore の 値が 使われる 可能性が 高まる。
大きすぎるとアプリケーションの メモリを 圧迫する 値 setAsynchronous に
ついて
DataStoreによっては、 「DataStoreの 保存自体が 非同期化されている」ので、 その 場合は 意味が ない。
実装するDataStoreに より、 どちらかは 使い分けた ほうが よさそう。
個人的には、
勉強に
以上です。
コメント