我正在使用嵌入式 HSQLDB。操作系统是 Windows 7。
以下是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
据我了解,数据应该每 500 毫秒写入一次磁盘。另一方面,它应该被缓存在内存中,直到 10MB 或 50,000 行在缓存中。
当我在大约一分钟和 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 有三个 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 个中任意数据库实例的目录:
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 个!
请向我解释这种奇怪的行为。