HSQLDB SET FILES CACHE ROWS / SIZE和SET FILES WRITE DELAY似乎没有按预期工作

时间:2013-04-06 11:31:18

标签: hsqldb

我正在使用嵌入的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 DELAYSET FILES CACHE属性覆盖。

我说错了吗?如果缓存在500毫秒结束之前溢出会发生什么?它会被冲洗还是会观察到500ms的延迟?

修改

这很奇怪。我在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个!

请告诉我这种奇怪的行为。

1 个答案:

答案 0 :(得分:0)

您在操作期间阅读目录可能无法显示实际文件大小。关机后这些尺寸正确显示。

RUNSTATS blob转到lobs文件。行位于数据文件中。每个blob将在lobs文件中占用32K(SET LOB SCALE 32)和128K之间。

WRITE DELAY设置仅与日志文件相关。它不适用于缓存和数据文件。

在Windows中,您可以使用资源管理器在右键单击后查看文件属性。这应该在操作期间显示当前文件大小。

相关问题