【问题标题】:Spring, Blob download, byte[] size increases twiceSpring,Blob 下载,byte[] 大小增加两倍
【发布时间】:2011-02-21 00:54:14
【问题描述】:

我正在使用带有 Hibernate 和 PostgreSQL 的 Spring 3.0,但遇到以下问题:
我正在将文件上传到数据库,保存其内容类型,一切正常,数据库中字段的大小正常。但是,当我尝试下载它时,Hibernate 返回的字节数组是它应该的两倍。下载的文件当然已损坏。大小是数据库中大小的 ESXACTLY 2 倍...我的代码如下所示:
字段域类(带映射):

private byte[] cv;

@Column(name="cv")
public byte[] getCv() {
  return this.cv;
}

加载对象的DAO函数:

public Candidate load(Integer id) {
  return (Candidate) getHibernateTemplate().get(Candidate.class, id);
}

会话工厂配置:

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">

    <property name="dataSource">
        <ref bean="dataSource"/>
    </property>

    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
            <prop key="hibernate.jdbc.batch_size">30</prop>
            <prop key="hibernate.show_sql">true</prop>
        </props>
    </property>

    <property name="packagesToScan" value="foo.foo.core.domain"/>

</bean>

SQL 创建:

CREATE TABLE candidate
(
  id serial NOT NULL,
  cv bytea,
  ...
)

如果有任何区别,数据库将采用 UTF-8 编码。
我正在尝试使用 org.springframework.jdbc.support.lob.DefaultLobHandler,但它并没有做到这一点。有什么想法吗?快把我逼疯了..

【问题讨论】:

  • 你确定是Hibernate返回了错误的数组,而不是之后一些转换的结果吗?

标签: hibernate spring postgresql bytearray blob


【解决方案1】:

找到解决方案,将 bytea 输出的数据库设置更改如下:

ALTER DATABASE SET bytea_output='escape';

奥斯卡。

【讨论】:

  • 如果这样可以解决您的问题,您还可以通过将 JDBC 驱动程序更新到版本 9.0-801 来解决它。该版本支持 Postgresql 9.0,此时 bytea 转义格式默认更改为 'hex'(更高效)。
  • 这正是导致问题的原因。我不知道他们为什么默认使用十六进制...
  • 可变长度的 bytea 转义格式实际上被证明是获取大值的性能瓶颈(因为服务器必须在内部不断重新分配缓冲区,iirc),这尤其影响了像 pg_dump 这样的工具。他们认为主要版本升级是引入一些非向后兼容功能的合理时机。
  • 这听起来对我有用!但我不知道如何运行该命令!
  • 好的,可以使用 ALTER DATABASE "MyDbName" SET bytea_output='escape' -- 谢谢 Oscar!
【解决方案2】:

我遇到了同样的问题,但仍然不知道如何解决,但这肯定是编码问题。 我将两个图像都保存在磁盘上,错误的是为原始代码的字符表示设置 HEX 代码,即

原始图像以以下字节开头(十六进制表示):

FF D8 FF E0 ...

翻转后的字节数组(双倍大小)如下:

66 66 64 38 66 66 65 30 ...

这恰好是将“ff d8 ff e0”的十六进制编码为字符 (f=66HEX)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-26
    相关资源
    最近更新 更多