-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
PowerJob连接Postgres数据库出现org.springframework.orm.jpa.JpaSystemException: Unable to access lob stream; nested exception is org.hibernate.HibernateException: Unable to access lob stream #153
Comments
感谢你那么细致的排查,并提供了恰当的解决方式。 PowerJob 对 PostgreSQL 的支持一直存在问题,正在找机会解决。 在后续版本会采纳你的建议并修复该问题。 再次感谢! |
还要加个自动提交事务的配置spring.datasource.hikari.auto-commit=true,不然会出现提示“org.postgresql.util.PSQLException: 大型对象无法被使用在自动确认事物交易模式”的问题 |
哈哈,你们这些 postgreSQL 用户可以提提 PR fix 下这个问题 |
我加上你这个配置也报错的 |
看看数据库里面这个字段的类型是不是text,可能是在创建过数据库后才加了这个注解 |
对 PG 不是很了解,这个问题一直拖到了现在 🐶 ~ 问题出现的原因 🤔在 Postgresql 12.6 自动生成的表结构下 debug 了一下源码,发现问题出现在解析结果集的时候,在处理 起初有点难以理解,这是什么奇怪的操作 👀 ?结果集里明明就有现成的结果了,为啥还和得服务端通信?这个错误信息又是什么意思? 后来查了一圈资料 + 翻了一波 Spring Data JPA (后面简称为 JPA,不过其实跟 Spring Data JPA 没啥关系,这里涉及到的内容都是 Hibernate 的源码)类型判断和建表的源码,大概是弄明白了 (〃´皿`)q 首先 PG 中没有 出现 另外,在 PG 中 JPA 自动建的表中 临时解决方案最直接的解决方案就是想办法让 Hibernate 不要将其识别为 而出现 “org.postgresql.util.PSQLException: 大型对象无法被使用在自动确认事物交易模式” 这个错误则是因为在 PG 中访问大对象必须开启事务。(参考 官方文档 ) 但其实只要使用了 后面看了下这位老哥的 PR 代码,其核心解决思路是提供了一个 但同样也存在一些问题,首先即使重写,也应该优先重写 问题出现的根本原因其实问题核心应该是为什么 JPA 自动建表的时候会将其解析成 text 类型,而读取的时候为什么不能将其当成 text 类型? 是使用姿势不对还是说 JPA 和 PG 的驱动有兼容性问题? JPA 中自动建表的原理大致如下(源码流程太长,只讲关键内容) JPA 在初始化会话工厂( 并通过调用 在生成 DDL 的时候,列的定义最终是通过调用 在初始化对应的数据库方言的时候,会将对应的类型映射信息写入其中,比如在 也就意味着,默认情况下,Hibernate 在 PG 环境对于 Clob 类型的列,在创建表的时候使用的列类型都是 text 。 这里再补充一下 JPA 中列类型识别的原理 JPA 在初始化模型元数据时,调用了 如果其 TypeName 不为空,则会优先根据 TypeName 推导类型。而 TypeName 信息是在 如果没有使用 而 综上两个原因就导致了建表的 “行为” 和 读取的 “行为” 不一致的情况(@lob 注解标记的 String 类型字段,在 PG 下,JPA 自动建表会使用 text 类型,而读取的时候却会被当成 也就是说并非我们使用的姿势不对,而是 JPA 和 PG 的驱动存在兼容性问题。 终极解决方案显然,终极解决方案就是让该字段的 JPA 自动建表行为 和 PG 驱动对该字段的处理保持 “一致”,即 JPA 自动建表时使用 oid 类型的列,或者 PG 驱动在处理时判断一下该列实际的存储类型(从结果集的元信息中获取)。从而保证不会出现能正常建表,却不能正常使用的情况。 那么问题来了,没人处理这个问题么?作为 “世界上最先进的开源数据库 ( The world's most advanced open source database )” 不应该才对 ! 🌚 搜了下,其实早在 6 年前就有人提过这个问题 , Correct JPA Annotation for PostgreSQL's text type without Hibernate Annotations Hibernate 的 Jira 上也有人报过问题,@Lob on String does not produce expected results for PostgreSQL 看了下相关内容,这个问题确实不是 Hibernate 的锅,而应该由 PG 的底层驱动支持。在 PG 的 JDBC 驱动项目搜了下相关 issue ,确实也有在处理只是还没发布, feat: allow byte[] and String to be accessed as .getLob, and .getClob #611 (在解析 综上,PG 用户在 PG 官方没有修复这个问题之前,可以通过以下方式解决这个问题(三选其一)
|
hi all, |
问题描述:
具体详情:
使用Postgres连接PowerJob,任务添加正常,但是在任务管理中刷新任务列表失败,报错:org.springframework.orm.jpa.JpaSystemException: Unable to access lob stream; nested exception is org.hibernate.HibernateException: Unable to access lob stream,通过排查找到接口为com.github.kfcfans.powerjob.server.web.controller.JobController#listJobs ,定位到该类中的 jobInfoPage = jobInfoRepository.findByAppIdAndStatusNot(request.getAppId(), SwitchableStatus.DELETED.getV(), pageRequest);
问题解决:
通过debug发现,是返回值中的JobInfoDO实体中的
// 执行器信息(可能需要存储整个脚本文件)
@lob
@column
private String processorInfo;
这个字段导致的反序列化失败,可能是因为该字段的类型是TEXT类型,通过修改为
// 执行器信息(可能需要存储整个脚本文件)
@column(columnDefinition = "TEXT")
private String processorInfo;
即可正常查询任务列表。
The text was updated successfully, but these errors were encountered: