之前,使用HSQLDB的时候没有考虑客户端内存的大小,建立的表都是Memory Table。这样,将表加载到客户端的时候,就会出现关于内存大小不够用的问题。昨天,打32个项目的PCB基线的时候,就出现了内存溢出的事情。
虽然,可以通过设置JVM的大小改变JVM所能占有的内存大小。btw:这里需要设置服务器端和客户端。
java 代码
- set JAVA_OPTS=-server -Xms512m -Xmx512m -XX:PermSize=256m -XX:MaxPermSize=256m
在客户端,直接设置JAVA控制台的JRE内存大小设置就可以了。能解决一定问题,但是不能解决所有的问题。
今天仔细查看了HSQLDB的说明文档,原来Memory Table表在数据库初始化的时候会被完全读写到内存当中,假设我的数据库有60M的话,这60M的内存将一下就读入到内存中去,当然就会占用大量的内存资源。等数据库关闭的时候,内存中的数据就会写到.Script文件当中去。当然还不包括对数据库进行的操作所耗费的资源等等,这么一下来,客户端耗费的资源就相当大了。
一个比较好的方法是将这种Memory Table转变为Cached Table。这样的话
“ CACHED 表是在使用CREATE CACHED TABLE 命令的时候生成的。它只有索引或部分数据是驻留在内存中的,所以可以允许生成容量为几百兆的表空间。CACHED 表的另外一个优点,即使它存储了大量的数据,数据库引擎只需花费很短的时间就可以启动。它的不足是在速度上有所降低。如果你的数据集相对小的时候,尽量不要使用CACHED 表。在小容量和大容量表共存的实际应用中,最好对哪些小容量的表使用默认的MEMORY 表。” --摘自HSQLDB用户指南
" If only memory tables (CREATE TABLE or CREATE MEMORY TABLE) are used then the database is limited by the memory. A minimum of about 100 bytes plus the actual data size are required for each row. If you use CREATE CACHED TABLE, then the size of the table is not limited by the memory beyond a certain minimum size. The data and indexes of cached tables are saved to disk. With text tables, indexes are memory resident but the data is cached to disk." --摘自HSQLDB FAQ
也就是说,如果我把其中比较大的Memory Table转换为Cached Table的话,占用的内存资源会相对较少,但是速度是会降低。测试了一下,导出单个项目的数据到HSQLDB数据库中,如果使用Memory的话,需要32s,但是,使用Cached Table的话,需要45s,数据文件有6M。
由于产品马上就要发布了,这个时候修改可能不是很恰当。先评估一下可能的影响吧。
- 需要备份的数据。以前就单单备份了一个.script文件,现在需要将这些文件都要备份起来。〔修改备份文件的逻辑,改为备份文件夹,压缩为zip文件〕
- 数据传输到客户端,需要将备份的压缩文件夹,先解压缩。
- 不能根据Scipt文件来创建内存数据库。如果加入了Cached Table的话,scipt文件中的信息不全,不能通过这种方式去Rebuild内存数据库。现有内存数据库使用方式需要改变为文件数据库的使用方式。
- SHUTDOWN COMPACT替换原来的SHUTDOWN命令。这样会使得生成的数据库文件大小稍微小一点。
这种统计的需求放到客户端去进行,真是难为客户端了,希望客户端的内存大点:)
真想把统计业务和系统常规业务分开,单独的统计系统来处理这些统计需求,就不会对常规业务系统造成影响了。不知道各位在处理统计需求的时候怎么处理?
分享到:
相关推荐
原代码和测试,我已经以Patch方式提交了原代码给HSQLDB opensource,去那里down也可以。 博文链接:https://manzuosteve.iteye.com/blog/243452
**HSQLDB**,全称为HyperSQL Database,是一款开源、轻量级且完全符合SQL标准的关系型数据库管理系统。它的设计目标是提供一个快速、可嵌入式的数据库引擎,适用于小型到中型的应用程序,同时也适合开发人员进行测试...
### HSQLDB中文文档第六章 Text表解析 #### 一、概述 HSQLDB (HyperSQL Database) 是一款高性能的开源轻量级关系型数据库管理系统,适用于开发测试环境及小型应用系统。Text表是HSQLDB的一个特色功能,主要用于...
**Cached Table**:缓存表结合了内存表和文本表的优点,数据首先存储在内存中,当内存满时,数据会被写入磁盘。关闭数据库后,数据仍然保留。 ### 三、启动过程分析 HSQLDB的启动过程涉及几个关键步骤: A. **实例...
HSQldb是一个轻量级的关系型数据库管理系统,特别适合用于系统演示、开发和测试环境。它的特点是快速、灵活且易于使用。HSQldb支持多种运行模式,满足不同场景的需求。 1. **数据库实例创建** 创建HSQldb数据库...
3. **创建表**:通过SQL语句`CREATE TABLE`定义表结构,如`CREATE TABLE Users (id INT PRIMARY KEY, name VARCHAR(50))`。 4. **插入数据**:使用`INSERT INTO`语句插入数据,如`INSERT INTO Users VALUES (1, '...
**HSQldb 2.25 知识点详解** HSQldb,全称为HyperSQL Database,是一款开源、轻量级、嵌入式的关系型数据库管理系统。它支持标准的SQL语法,包括SQL-92和SQL:2003,且在Java环境中运行,无需依赖外部操作系统服务。...
### HSQLDB快速连接数据库 #### 一、HSQLDB简介与特点 HSQLDB(HyperSQL Database)是一款优秀的轻量级开源纯Java SQL数据库管理系统。它被设计为易于集成到现有的Java应用环境中,尤其适合那些对性能和资源消耗有...
**HSQldb 2.2.8 数据库详解** HSQldb(HyperSQL Database)是一款高效、轻量级且开源的Java数据库管理系统,它在IT领域中被广泛应用于开发、测试以及小型应用环境。HSQldb完全用Java编写,因此具有良好的跨平台性,...
hsqldb数据库下载,很好用,简易的内存数据库,特别适合初学者。
HSQldb是一个开源的、轻量级的关系型数据库管理系统,主要设计用于嵌入式环境,同时也支持服务器模式。它实现了SQL标准,支持多种数据库功能,包括事务处理、存储过程、触发器和视图等。本实例源代码将帮助我们深入...
HSQldb,全称HyperSQL Database,是一款开源的、轻量级的关系型数据库管理系统,尤其适合于嵌入式应用和开发测试环境。HSQldb完全用Java编写,因此具有跨平台性,能在任何支持Java的环境中运行,包括Windows操作系统...
《HSQldb与Java数据库连接详解》 HSQldb(HyperSQL Database)是一款开源、轻量级、嵌入式的关系型数据库管理系统,广泛应用于Java应用程序中。它支持SQL标准,提供单用户和多用户模式,并且可以运行在内存中或磁盘...
### HSQLDB中文帮助文档知识点总结 #### 一、HSQLDB概述 - **定义**:HSQLDB(HyperSQL Database)是一款轻量级、开源的纯Java SQL数据库管理系统。它能够作为嵌入式数据库使用,也可以作为一个独立的服务器运行。 ...
hsqldb jdbc driver适合于hsqldb