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 個を超えるオブジェクトが既に挿入されています!
この奇妙な振る舞いを説明してください。