2011-01-10 71 views
11

我用Hibernate 3.2和PostgreSQL 8.4开始了一个应用程序。我有一些byte[]字段被映射为@Basic(= PG bytea)和映射为@Lob(= PG大对象)的其他字段。为什么不一致?因为我是一个Hibernate noob。PostgreSQL:BYTEA vs OID +大对象?

现在,这些字段最大为4 Kb(但平均值为2-3 kb)。 PostgreSQL文档提到,当字段很大时,LO是好的,但我没有看到“大”意味着什么。

我已经使用Hibernate 3.6升级到PostgreSQL 9.0,并且我坚持要将注释更改为@Type(type="org.hibernate.type.PrimitiveByteArrayBlobType")。这个bug带来了一个潜在的兼容性问题,并且我最终发现大型对象与一个普通的字段相比是一个很难处理的问题。

所以我想把它全部改为bytea。但我担心bytea字段是以十六进制编码的,所以在编码和解码时会有一些开销,这会损害性能。

是否有良好的基准关于这两方面的表现? 有人做了开关,看到了一个区别?

回答

5

基本上有些情况下每个都有意义。 bytea更简单并且通常是首选。客户端库给你解码,所以这不是一个问题。

但是,LOB具有一些简洁的特性,例如能够在它们中寻找并将LOB视为字节流而不是字节数组。

“大”意味着“足够大你不想一次发送给客户端。”从技术上讲,bytea被限制为1GB压缩,并且一个lob限制为2GB压缩,但是无论如何你真的首先达到了其他限制。如果足够大,您不希望它直接在结果集中,而且也不想将它一次全部发送到客户端,请使用LOB。

4

但我很担心,BYTEA领域 十六进制编码

BYTEA输入可以是十六进制或逃避格式,这是你的选择。存储将是相同的。从版本9.0开始,输出默认值为十六进制,但可以通过编辑参数bytea_output来更改此设置。

我还没有看到任何基准。

+0

此外它不是以十六进制存储的,我认为libpq(甚至可能是协议)有一个二进制传输接口。 – 2013-11-16 04:09:40

1

我没有比较大的对象和bytea方便,但请注意,切换到9.0的十六进制输出格式也是因为它比以前的自定义编码更快。就二进制数据的文本编码而言,你可能不会比目前的速度快得多。

如果对您来说不够好,您可以考虑在PostgreSQL客户端和服务器之间使用二进制协议。然后你基本上从磁盘上获得东西,就像大型对象一样。我不知道PostgreSQL JDBC是否支持这个功能,但是快速搜索建议不支持。