2024/02/08

@DbLookup とキャッシュの動作

@DbLookup や @DbColmun には、キャッシュをコントロールする機能があります。以下の構文の赤字の部分ですね。

@DbLookup(class:cache; server:database; view; key; columnNumber; keywords)

@DbColumn(class:cache; server:database; view; columnNumber)

今回はこの機能が実行結果にどのように作用するのか検証した結果をまとめます。


検証環境とアプリ

多少のバージョンの違いで動作に差が出るような検証ではありませんが、検証に使用した Notes/Domino の環境は次の通りです。

  • Notes 12.0.2 FP2
  • Domino 14.0

続いて検証アプリです。

まず、@DbLookup で検索されるアプリは以前『Project KEEP 体験:#3)郵便番号検索 - 準備作業』で作成した郵便番号マスタを使用しました。郵便番号を検索するためのビュー SchZip を追加作成しています。

@DbLookup で検索しますので 1 列目は郵便番号でソートしています。


テストフォームは、マスタとは別の nsf に作成します。作成するフィールドは次の通りです。今回はテストですので、固定の郵便番号を検索して結果を取得するものとします。各フィールドの種類は "テキスト" で "作成時の計算結果" とします。

ラベル フィールド名
郵便番号 Zip "6820948"
住所1 Kana1 式① (n = 2)
Addr1 式① (n = 3)
住所2 Kana2 式① (n = 4)
Addr2 式① (n = 5)
住所3 Kana3 式① (n = 6)
Addr3 式① (n = 7)

◇ 式①

@DbLookup(Mode; Srv: FP; "SchZip"; Zip; n)

また、上記式で使用している 3 つのフィールドは次の通りとし、フォーム上部に配置します。

フィールド名 オプション
Srv 非表示 @Subset(@DbName; 1)
FP 非表示 マスタDBのファイルパスを文字列で指定
Mode 複数値
非表示
xTest1 := "";
xTest2 := "Notes":"ReCache";
xTest3 := "Notes":"NoCache";

xTest1

なお、Mode の式の赤字部分を xTest2 に変更すると "ReCache" のテストができるようにしています。こうしておくと、テストが容易ですね。


テストエージェント

今回はキャッシュのテスト行うので、マスタ文書を更新した後にフォームを開き、更新後のマスタを取得できるかを確認します。

そこで、エージェントを作成して以下の処理を一気に実行します。

  1. 検索されるマスタデータに処理時刻を書き込む
  2. フォームを表示して @DbLookup を実行(1 で更新した郵便番号の値を取得)
  3. 文書内にマスタデータの処理時刻を表示

実行すると次のように時刻を書き込みます。

その後開いたフォームにおいて、キャッシュから値を取得すると 2 と 3 の値が異なることとなるという算段です。


作成したエージェントは次の通りです。

Option Declare

Private xns As NotesSession
Private xndb As NotesDatabase
Private Const xcFP = "zipcode.nsf"
Private Const xcZip = "6820948"

Sub Initialize
   Dim nuiw As New NotesUIWorkspace
   Dim nuid As NotesUIDocument
   Dim nd As NotesDocument
   Dim s As String

   '初期化
   Set xns = New NotesSession
   Set xndb = xns.CurrentDatabase

   ' 1. マスタに処理時間を書き込む
   s = xUpdateZip()

   ' 2. テストフォーム表示し、@DbLookup を実行
   Set nuid = nuiw.ComposeDocument(xndb.Server, xndb.FilePath, "DbLookupTest")

   ' 3. 処理時刻を表示
   Set nd = nuid.Document
   Call nd.ReplaceItemValue("Time", s)

End Sub

Function xUpdateZip() As String
   Dim ndbZip As NotesDatabase
   Dim nv As NotesView
   Dim nd As NotesDocument
   Dim s As String

   'テストのマスタを取得
   Set ndbZip = xns.GetDatabase(xndb.Server, xcFP, False)
   Set nv = ndbZip.GetView("SchZip")
   Set nd = nv.GetDocumentByKey(xcZip, True)

   '処理時刻を付加
   s = Format(Now, "hh:nn:ss")
   Call xUpdateZip_Address3(nd, s)

   '処理時刻を返す
   xUpdateZip = s
End Function

Function xUpdateZip_Address3(vnd As NotesDocument, ByVal vsTime As String) As String
   Dim v As Variant

   '時刻を付加して保存
   v = vnd.address3(0)
   v = Split(v, "_")
   ReDim Preserve v(1)
   v(1) = vsTime
   vnd.address3 = Join(v, "_")

   Call vnd.Save(True, False)
End Function

エージェントの最後で、処理時刻を文書の Time フィールドにセットしています(赤字部分)。これを表示するためにフォーム上にも Time フィールドを作成しておきます。

完成したフォームのイメージは次の通りです。


キャッシュの検証

まずは、キャッシュが有効な場合をテストします。Mode フィールドの計算式の最後を xTest1 となっていることを確認し、エージェントを実行します。

キャッシュの都合で一致することもありますが、ほとんどの場合、時刻にずれが発生します。更新したてのデータではなく、キャッシュ内の過去のデータを取得していることがわかります。


続いて、Mode フィールドの計算式の最後を xTest2 と修正し ReCache のテストを行います。結果は次の通り、時刻が一致しました。キャッシュを更新してから取得していることがわかります。

この結果は NoCache の場合も全く同じでした。


まとめ

この検証結果より、最新データを必ず取得したい場合には、キャッシュしないように設定する必要があることがわかりました。

ただ、今回のテストでは、ReCache と NoCache の違いは見つかりませんでした。次回はこの点について検証したいと思います。


0 件のコメント:

コメントを投稿