VB6.0用掲示板の過去のログ(No.1)−VBレスキュー(花ちゃん)
[記事リスト] [新規投稿] [新着記事] [ワード検索] [過去ログ] [管理用]

投稿日: 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"を参照設定して
# 利用するということもできます。


- 関連一覧ツリー (★ をクリックするとツリー全体を一括表示します)

- 返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)

- Web Forum -