基于文件的数据库-HSQLDB:35 MB,H2:85 MB

时间:2019-08-08 06:48:46

标签: spring-boot spring-data-jpa h2 hsqldb

我在数据库中存储了500.000条记录,每条记录大约50个字符。每小时都会清除数据库并插入50万条记录。

我通常更喜欢H2,但我不明白为什么database.mv会有85 MB大(清除和还原甚至200 MB之后)。 我还尝试了hsqldb,它一直只使用35 MB。

我使用具有以下特性的弹簧靴: H2:

spring.datasource.driverClassName=org.h2.Driver
spring.datasource.url=jdbc:h2:file:./h2
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

HSQLDB:

spring.datasource.driver-class-name=org.hsqldb.jdbc.JDBCDriver
spring.datasource.url = jdbc:hsqldb:file:data
spring.datasource.username=sa
spring.datasource.password=

1 个答案:

答案 0 :(得分:1)

您的问题是什么?

您在H2中使用永久数据库。 H2有两个存储后端。默认值是基于MVStore的默认值,它更适合于具有高数据争用的多线程应用程序,但是它也使用写时复制数据策略,并且需要自己付费。大规模更新会显着增加数据库的大小。当然,该空间将在以后重用。传统的PageStore后端在这种用例中表现更好,但是它使用表级锁,并且不会并行执行来自不同会话的多个命令。必要时MVStore和PageStore都可以从磁盘读取数据,大型数据库不需要太多内存。

HSQLDB默认情况下将所有内容保存在内存中,但其存储格式更紧凑。它还不会为索引使用额外的空间,因为无论如何该表都将完全加载到内存中。当然,您不能以这种方式使用非常大的表。 HSQLDB还具有普通的磁盘表,您可以使用CREATE CACHED TABLE创建此类表,并且这些表以完全不同的格式存储,并且比基于内存的表在磁盘上使用更多的空间。但是,与H2中的持久化表相比,此类表仍然可以使用更少的空间。

如果要使用H2中的内存表,则需要使用CREATE MEMORY TABLE创建它们,它们使用较少的磁盘内存。默认情况下,H2不会创建此类磁盘效率低和内存效率低的表。