【问题标题】:File based DB - HSQLDB: 35 MB, H2: 85 MB基于文件的数据库 - HSQLDB:35 MB,H2:85 MB
【发布时间】:2019-12-15 19:35:22
【问题描述】:

我在数据库中存储了 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=

【问题讨论】:

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


    【解决方案1】:

    你的问题是什么?

    您在 H2 中使用持久性数据库。 H2 有两个存储后端。默认是基于 MVStore 的,更适合多线程应用,数据争用高,但也使用了写时复制的数据策略,有自己的成本。大规模更新可以显着增加数据库的大小。当然,空间稍后会被重复使用。旧版 PageStore 后端在此类用例中表现更好,但它使用表级锁,并且不会并行执行来自不同会话的多个命令。 MVStore 和 PageStore 都可以在必要时从磁盘中读取数据,对于大型数据库它们不需要太多内存。

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

    如果你想在 H2 中使用内存表,你需要使用CREATE MEMORY TABLE 创建它们,它们使用的磁盘内存量较小。默认情况下,H2 不会创建这种磁盘效率低和内存效率低的表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-29
      • 2017-11-21
      • 2012-07-04
      • 2018-08-27
      • 1970-01-01
      • 2012-02-02
      • 2017-08-31
      相关资源
      最近更新 更多