在 h2 数据库中保存大文件

Bjo*_*nic 5 hibernate h2 h2db spring-boot

我最近将我的springboot项目中的h2数据库更新到2.1.210。

这引发了一些问题,其中大部分我都能自己解决。我无法解决的问题是在数据库中保存大文件。

当我尝试上传 ~3,5MB 文件时,出现以下错误:

org.h2.jdbc.JdbcSQLDataException: 
Value too long for column "BINARY VARYING": "504b03040a00000000008a6bd150e8d6354d8303010083030100070000003030302e706e6789504e... (3648495)" [22001-210]
Run Code Online (Sandbox Code Playgroud)

在 h2 1.4.200 上完美运行的注释如下所示

@Lob
@Type( type = "binary" )
@Column(name = "ZIP", columnDefinition="BLOB")
private byte[] zip;
Run Code Online (Sandbox Code Playgroud)

我不知道它是否相关,但我在使用时也遇到错误

@Type( type = "text" )
Run Code Online (Sandbox Code Playgroud)

这里的错误是

Precision ("2147483647") must be between "1" and "1048576" inclusive
Run Code Online (Sandbox Code Playgroud)

因为每当我使用“文本”时,它就会被翻译为varchar(2147483647)

ATG*_*ATG 0

从 H2 版本 2 开始,该org.h2.value.Value.getBytes()方法似乎发生了重大变化,以限制字节数组在内存中可以保存的数量。

H2 手册(数据类型大对象)表示,BINARY VARYING 允许的长度为 1 到 1048576 字节,对于其他任何内容ResultSet.getBinaryStream(...)都是首选方法。

我不确定你如何在 HQL 中控制它或使用 Hibernate 注释,但将数据类型从byte[]某种流更改可能会鼓励 ORM 避免rs.getBytes(...)并调用 H2 喜欢的方法。