0

HSQLDB組み込みを使用しています。OSはWindows7です。

SET FILESスクリプト ファイルに表示されるプロパティは次のとおりです。

SET FILES WRITE DELAY 500 MILLIS
SET FILES BACKUP INCREMENT TRUE
SET FILES CACHE SIZE 10000
SET FILES CACHE ROWS 50000
SET FILES SCALE 32
SET FILES LOB SCALE 32
SET FILES DEFRAG 0
SET FILES NIO TRUE
SET FILES NIO SIZE 256
SET FILES LOG FALSE
SET FILES LOG SIZE 50

このことから、500ms ごとにデータをディスクに書き込む必要があることがわかりました。一方、キャッシュに 10MB または 50,000 行が収まるまで、メモリにキャッシュする必要があります。

約 1 分後に 6,000 レコードが保存された後、データベースのディレクトリを表示すると、次のように表示されます。

d:\tmp\test\hsqldb\Run_0>dir
 Le volume dans le lecteur D s’appelle DATA
 Le numéro de série du volume est 3C08-FEE7

 Répertoire de d:\tmp\test\hsqldb\Run_0

06/04/2013  07:10    <REP>          .
06/04/2013  07:10    <REP>          ..
06/04/2013  07:10                32 data.data
06/04/2013  07:10                 0 data.lck
06/04/2013  07:10                 0 data.lobs
06/04/2013  07:10                 0 data.log
06/04/2013  07:10                89 data.properties
06/04/2013  07:10             1,757 data.script
06/04/2013  07:10    <REP>          data.tmp
               6 fichier(s)            1,878 octets
               3 Rép(s)  73,975,611,392 octets libres

d:\tmp\test\hsqldb\Run_0>

サイズに注意してください。

SET FILES WRITE DELAYしたがって、プロパティによってオーバーライドされていると推測しSET FILES CACHEます。

私は正しいですか?500 ミリ秒が経過する前にキャッシュがオーバーフローするとどうなりますか? フラッシュされますか、それとも 500 ミリ秒の遅延が観察されますか?

編集

変ですね。50 の異なる HSQLDB 組み込みデータベースにデータを分散します (50 の異なるデータ ソース オブジェクトを使用)。各 DB には 3 つの CACHED テーブルがあります。

CREATE TABLE RUNSTATS
(
   ID      BINARY(16)   NOT NULL,
   ENTITY  BLOB(128K)     NOT NULL
   ,CHECK (PUBLIC.RUNSTATS.ID IS NOT NULL)
   ,CHECK (PUBLIC.RUNSTATS.ENTITY IS NOT NULL)
);

ALTER TABLE RUNSTATS
   ADD CONSTRAINT pk_runstats
   PRIMARY KEY (ID);

CREATE TABLE RUNSTATS__AVGLATENCYINDEX
(
   ID          BINARY(16),
   TIMESTAMP   BIGINT,
   FLOWID      VARCHAR(200),
   AVGLATENCY  DOUBLE
);

ALTER TABLE RUNSTATS__AVGLATENCYINDEX
   ADD CONSTRAINT pk_runstats__avglatencyindex
   PRIMARY KEY (ID, FLOWID);

CREATE INDEX IDX_RUNSTATS__AVGLATENCYINDEX_FLOWID
   ON RUNSTATS__AVGLATENCYINDEX (FLOWID ASC);

CREATE TABLE RUNSTATS__CLIENTGWTOTALININDEX
(
   ID          BINARY(16),
   TIMESTAMP   BIGINT,
   FLOWID      VARCHAR(200),
   CLIENTGWTOTALIN  DOUBLE
);

ALTER TABLE RUNSTATS__CLIENTGWTOTALININDEX
   ADD CONSTRAINT pk_runstats__clientgwtotalinindex
   PRIMARY KEY (ID, FLOWID);

CREATE INDEX IDX_RUNSTATS__CLIENTGWTOTALININDEX_FLOWID
   ON RUNSTATS__CLIENTGWTOTALININDEX (FLOWID ASC);

これまでに、データベースは 26,000 個の RUNSTATS オブジェクト (それぞれ約 1K)、52,000 個の RUNSTATS_AVGLATENCYINDEXオブジェクト、および 52,000 個の RUNSTATS_CLIENTGWTOTALININDEXオブジェクトを受け取りました。

以下は、50 のうちの任意の DB インスタンスのディレクトリです。

d:\tmp\test\hsqldb\Run_12>dir
 Le volume dans le lecteur D s’appelle DATA
 Le numéro de série du volume est 3C08-FEE7

 Répertoire de d:\tmp\test\hsqldb\Run_12

06/04/2013  07:10    <REP>          .
06/04/2013  07:10    <REP>          ..
06/04/2013  08:25         8,388,608 data.data
06/04/2013  07:10                 0 data.lck
06/04/2013  07:10                 0 data.lobs
06/04/2013  07:10                 0 data.log
06/04/2013  07:10                89 data.properties
06/04/2013  07:10             1,757 data.script
06/04/2013  07:10    <REP>          data.tmp
               6 fichier(s)        8,390,454 octets
               3 Rép(s)  33,617,223,680 octets libres

d:\tmp\test\hsqldb\Run_12>

Java プロセスの RAM が 3GB を超えました。

RUNSTATS オブジェクトは lobs ファイルに移動する必要がありますね。では、なぜこのファイルが空であると報告されるのでしょうか? RUNSTATS オブジェクトが約 1K かかる場合、約 10,000 個のオブジェクトの後で 10,000K の制限に達しますが、26,000 個を超えるオブジェクトが既に挿入されています!

この奇妙な振る舞いを説明してください。

4

1 に答える 1

1

操作中のディレクトリの読み取りでは、実際のファイル サイズが表示されない場合があります。これらのサイズは、シャットダウン後に正しく表示されます。

RUNSTATS BLOB は LOB ファイルに移動します。行はデータ ファイルにあります。各 BLOB は、LOB ファイルで 32K (SET LOB SCALE 32) から 128K の間になります。

WRITE DELAY 設定は、ログ ファイルのみに関連しています。キャッシュおよびデータ ファイルには適用されません。

Windows では、ファイルを右クリックした後、エクスプローラーを使用してファイルのプロパティを表示できます。これにより、操作中の現在のファイル サイズが表示されます。

于 2013-04-06T13:48:15.287 に答える