【问题标题】:Invalid operation: result set is closed. ERRORCODE=-4470, SQLSTATE=null无效操作:结果集已关闭。错误代码=-4470,SQLSTATE=null
【发布时间】:2012-12-31 18:32:09
【问题描述】:

我正在使用键从表中检索某些数据。 我正在使用休眠查询来检索数据。

我能够检索特定键的数据。但对于其他一些键,我收到错误或异常。我得到的例外是

[1/17/13 14:07:41:819 IST] 0000004c LongType I **org.hibernate.type.NullableType nullSafeGet 无法从结果集中读取列值:BRAND1_23_2_; [jcc][t4][10120][10898][3.58.81] 无效操作:结果集已关闭。错误代码=-4470,SQLSTATE=null** [1/17/13 14:07:41:822 IST] 0000004c JDBCException W org.hibernate.util.JDBCExceptionReporter logExceptions SQL 错误:-4470,SQLState:null [1/17/13 14:07:41:823 IST] 0000004c JDBCException E org.hibernate.util.JDBCExceptionReporter logExceptions [jcc][t4][10120][10898][3.58.81] 无效操作:结果集已关闭.错误代码=-4470,SQLSTATE=null [1/17/13 14:07:41:826 IST] 0000004c DefaultLoadEv I org.hibernate.event.def.DefaultLoadEventListener onLoad 执行加载命令时出错 org.hibernate.exception.GenericJDBCException:无法加载实体:[com.travelport.soa.gds.airline.brandfares.entity.FareCollection#490] 在 org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:126) 在 org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:114) 在 org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)

【问题讨论】:

  • 发布一些您正在尝试的代码

标签: java hibernate db2 websphere


【解决方案1】:

您获取了一个具有一对多关系的实体,该实体在 Java 中表示为延迟加载的Collection,并且您在关闭已获取的 Hibernate 会话后尝试迭代该集合目的。您必须急切地获取集合或扩大会话边界以包含您的迭代代码。

【讨论】:

  • 本次会议结束的具体地点在哪里?无论如何,我没有明确地处理关闭/启动会话..??
  • 如果您使用某种声明式事务管理,您必须了解框架提供给您的事务范围。我想最好的选择是急切地获取收藏。
  • 确实如此。可能是最常见的错误,因此也是(完全不必要的)急切加载的最常见原因。而这一切都源于未能理解 Hibernate 的两个最基本和最基本的概念:持久集合和会话生命周期边界。
  • @pap 作为记录,我从不使用延迟加载或任何其他在随机时间发射随机 SQL 的魔法。我为每个任务编写特定的 HQL,它准确地获取了我需要的内容。我发现 ORM 和“持久状态管理”的整个想法令人反感,而且比它的价值更麻烦。我仍然更喜欢 HQL,因为它具有数据库中立性以及连接条件和业务逻辑条件之间的关注点分离的特性。
  • @MarkoTopolnik 我很同情,但它引出了一个问题:如果你不打算利用 Hibernate 的固有优势,你为什么还要使用它?此外,如果您知道自己在做什么并且您的域适合 ORM,那么 Hibernate 真的很强大。尤其是当您可以充分利用 L2 缓存和延迟加载等功能时。 “在随机时间拍摄随机 SQL”只是另一种说法,您不知道 Hibernate 是如何工作的,也不知道如何正确使用它......
【解决方案2】:

在数据源自定义属性中使用 kodo 时将 resultSetHoldability 设置为 1

【讨论】:

    【解决方案3】:

    DB2 中 SQL 代码 -4470 的最终原因有很多。这是一个简短的列表:

    1. 程序错误(如本例),在光标关闭之前关闭 已完全阅读。
    2. 已安装的 JDBC 驱动程序中的错误: https://issues.jboss.org/browse/JBPAPP-2408
    3. 由于文档不正确导致驱动程序使用不当: http://www-01.ibm.com/support/docview.wss?uid=swg1IV45140
    4. DB2 服务器中的错误: https://www-01.ibm.com/support/knowledgecenter/SSEPGG_9.5.0/com.ibm.db2.luw.admin.trb.doc/doc/c0020806.html

    【讨论】:

      【解决方案4】:

      如果惰性/急切获取策略是一个问题,您可能需要使用@OneToMany(fetch=FetchType.EAGER) 并可能阅读Hibernate One To Many Eager Not Pulling in all DataHow to Fetch @OneToMany and @ManyToMany EntitiesA Short Primer On Fetching Strategies

      我建议发布一些关于如何获取数据库和受影响记录的 sn-ps。您可能想使用https://gist.github.com/

      【讨论】:

        【解决方案5】:

        我得到同样错误的原因是因为我关闭了 db2 连接,然后尝试读取结果集。请强调在读取结果集时 db2 必须保持连接。

        【讨论】:

        • 是的,我将 resultSetHoldability 属性更改为 1 ,所以它工作正常。但是我可以知道关于 resultSetHoldability 属性的全部内容吗??
        猜你喜欢
        • 2013-02-20
        • 1970-01-01
        • 2015-07-20
        • 1970-01-01
        • 2013-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-21
        相关资源
        最近更新 更多