【问题标题】:Why H2 is not storing BLOBs as separate files?为什么 H2 不将 BLOB 存储为单独的文件?
【发布时间】:2020-08-25 14:22:19
【问题描述】:

我正在使用 H2 v1.4 嵌入式 - MVStore、Spring 和 JPA

现在 H2 文档说

默认情况下,此数据库存储与主表数据分开的大型 LOB(CLOB 和 BLOB)对象。小 LOB 对象就地存储,

这是我所期望的 - 但是,无论出于何种原因,H2 仍在将大型 BLOB 内容推送到主 db 文件。我尝试将 MAX_LENGTH_INPLACE_LOB 设置为 1 甚至 0 之类的值,但这没有任何区别。如何强制 H2 开始将 blob 保存为单独的文件?

实体中定义的字段

@Lob
private Blob source;

我也尝试过将byte[]@Column(definition="BLOB") 一起使用,但结果完全相同

Blob 创建 (

 Session session = entityManager.unwrap(Session.class);
            return Hibernate.getLobCreator(session).createBlob(inputStream, inputStream.available());

保存/读取工作正常 - 唯一的问题是我宁愿将 blob 作为单独的文件

【问题讨论】:

    标签: spring jpa h2


    【解决方案1】:

    文档没有讨论单独的文件,您不能强制 H2 使用它们。

    每个表都有一个主索引,用于存储所有数据。当数据库读取一行时,它会读取整行及其所有列。较大的值可能会产生明显的开销。但是 LOB 值(不包括不超过MAX_LENGTH_INPLACE_LOB 的小值)是单独存储的,并且在读取行时不会被访问,因此它们不会产生这种开销。 LOB 对象只有在应用程序读取其内容时才会被读取。

    有些查询不使用主索引。例如,如果您在 (A, B) 列上有索引,则查询 SELECT B FROM tableName WHERE A = ? 将仅使用该索引。 SELECT B, C … WHERE A = ? 将使用该索引和主索引。但这与您的问题没有直接关系。

    【讨论】:

    • 实际上,PageStore 将 blob 作为单独的文件保存在 dbname.lobs.db/* 中(就像 Mysql 一样)。我不知道为什么这已经改变了。另一件事 - 由于所有表都存储在单个文件中 - 单独存储是如何分开的?这不适合我。只是数据可以分“2个阶段”读取,没有别的?
    • 我认为您说的是 H2 的旧版本,其中 LOB 存储完全不同。所有数据都存储在主文件中,但在文件的不同位置。表扫描操作不需要从文件系统中读取其他表的无关数据,也不需要读取LOB的值,不像其他数据类型的值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 2021-09-27
    • 2019-02-15
    • 2015-10-26
    • 2020-01-22
    • 2016-04-03
    相关资源
    最近更新 更多