投稿日 | : 2002/11/19(Tue) 18:32 |
投稿者 | : 魔界の仮面弁士 |
Eメール | : |
URL | : |
タイトル | : Jetデータベースのキャッシュ動作 |
> VB6からACCESS2000のデータベースを使ってACCESS2000の帳票に出力するときに、
> データベースの同期を取るために5秒時間稼ぎをしないといけないのです。
5秒というのは、リードキャッシュの更新間隔ですね。レジストリの
HKLM\SOFTWARE\Microsoft\Jet\4.0\Engines\Jet 4.0\PageTimeout
によって設定される事になっています。(上記項目の初期設定値は 5000 です)
ただし厳密に言えば、それとは別にライトキャッシュの更新間隔分の待機も
必要だったりします。そのため、必ずしも5秒待てば良いというわけではありません。
> もし他に方法があれば教えていただきたいのです。
まずは、『ライトキャッシュ機構を使わず、直接mdbを更新する方法』から―――。
データの更新前後では、必ず、明示的にトランザクションを張るようにしてください。
これにより、Jetの自動遅延書き込み機構を使わない「同期書き込み」が行われるようになります。
なお、トランザクションの発行は、
[DAO]
WorkspaceオブジェクトのBeginTrans、CommitTrans、Rollback メソッド
[ADO]
ConnectionオブジェクトのBeginTrans、CommitTrans、RollbackTrans メソッド
で行います。
# ちなみに、トランザクションを張っていなかった場合は、「非同期書き込み」が利用されます。
# この場合、『ライトキャッシュがレジストリのMaxBufferSizeに指定されたサイズを超えた時』、
# もしくは、『最後の書込み動作以降に、レジストリのFlushTransactionTimeoutに設定された時間が
# 経過した時』に、メモリ上のキャッシュデータがmdbファイルに書き込まれるようになっています。
さて、上記により、Jetのライトキャッシュ機構を使わずに更新させる事ができますが、
さらにもう一点、OS自身のライトキャッシュ機構もバイパスさせる必要があります。
OS自身のライトキャッシュをフラッシュさせるには、
[DAO]
objWorkspace.CommitTrans dbForceOSFlush
[ADO]
Const JET_TCM_ASYNCFLUSH = 0
Const JET_TCM_SYNCFLUSH = 1
objConnection.Properties("Jet OLEDB:Transaction Commit Mode").Value = JET_TCM_SYNCFLUSH
というコードを実行すればOKです。
これらを行う事で、ライトキャッシュの待機が不要となります。
さて、ここからが本題。
『Jetのリードキャッシュを強制的にフラッシュさせる方法』です。
これは、レポートを開く前に、あらかじめ
[DAO]
DBEngine.Idle dbRefreshCache
[ADO]
CreateObject("JRO.JetEngine").RefreshCache objConnection
を行っておく事で回避できます。
上記のコードを実行すると、5秒間待機させたりせずとも、ディスク上から
強制的に、現在のキャッシュにデータを読み込ませる事ができます。
# ちなみに、JRO.JetEngineオブジェクトは、CreateObjectする以外にも、
# "Microsoft Jet and Replication Objects Library"を参照設定して
# 利用するということもできます。