gpt4 book ai didi

postgresql - PSQL异常 : Large Objects may not be used in auto-commit mode

转载 作者:行者123 更新时间:2023-11-29 11:47:14 26 4
gpt4 key购买 nike

我正在使用 WildFly 10、Java EE、JPA 和 Hibernate。最近我将我的应用程序从 MySQL 迁移到 PostgreSQL。在使用 MySQL 时,我会使用以下方法将图像存储在我的实体中:

@Lob
@Basic(fetch = FetchType.LAZY)
private byte[] image;

效果很好,MySQL 使用 LONGBLOB 来存储数据。

切换到 PostgreSQL 后,列类型为 OID,持久化图像时出现此错误:

Caused by: org.postgresql.util.PSQLException: Large Objects may not be used in auto-commit mode.
at org.postgresql.largeobject.LargeObjectManager.createLO(LargeObjectManager.java:308)
at org.postgresql.largeobject.LargeObjectManager.createLO(LargeObjectManager.java:296)
at org.postgresql.jdbc.PgPreparedStatement.createBlob(PgPreparedStatement.java:1202)
at org.postgresql.jdbc.PgPreparedStatement.setBlob(PgPreparedStatement.java:1243)
at org.jboss.jca.adapters.jdbc.WrappedPreparedStatement.setBlob(WrappedPreparedStatement.java:1157)
at org.hibernate.type.descriptor.sql.BlobTypeDescriptor$4$1.doBind(BlobTypeDescriptor.java:112)
at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:73)
at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:257)
at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:252)
at org.hibernate.type.AbstractSingleColumnStandardBasicType.nullSafeSet(AbstractSingleColumnStandardBasicType.java:39)
at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2598)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2883)
... 131 more

我是这样插入的:

@PersistenceContext
EntityManager entityManager;

...

//Simple insert method...
this.entityManager.persist(entity);

这是我的persistence.xml:

<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="MyApp" transaction-type="JTA">
<jta-data-source>java:jboss/datasources/PostgreSQLDS</jta-data-source>
<shared-cache-mode>DISABLE_SELECTIVE</shared-cache-mode>
<properties>
<property name="hibernate.enable_lazy_load_no_trans" value="true"/>
<property name="hibernate.cache.use_second_level_cache"
value="true"/>
<property name="hibernate.cache.use_query_cache" value="true"/>
</properties>
</persistence-unit>
</persistence>

我已经查看了有关此异常的多个其他问题,但我一直无法解决问题。

One suggestion是创建一个专门用于存储数据的实体,并使用 @OneToOne 关系,以便可以急切地获取存储数据的实体,但这并没有以任何方式改变结果。

另一个建议是禁用 Hibernate 的自动提交

<property name="hibernate.connection.autocommit" value="false"/>

...也什么也没做。

我完全不知道为什么这行不通。看起来这似乎不是一个非常常见的异常,我觉得我正在以完全错误的方式处理存储图像数据的任务。我该怎么做才能解决这个问题,或者我应该如何存储数据?

最佳答案

我无法告诉您这在 Hibernate 中是如何完成的,但是打开和读取/写入大对象必须在同一个数据库事务中发生。

禁用自动提交模式应该可以解决问题,也许您做错了什么。

但是我可以建议你完全不要使用大对象吗?
通常使用 bytea PostgreSQL 数据类型要容易得多,它可以包含最大 1GB 的数据。除非您以 block 的形式存储和检索数据,否则大对象不会提供任何优势,而且我怀疑您是否可以通过 ORM 充分利用大对象功能。

关于postgresql - PSQL异常 : Large Objects may not be used in auto-commit mode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38647692/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com