Datanucleus JDO 5.0.10连接Informix查询无结果问题求助
问题分析与解决方案
从你提供的堆栈跟踪来看,核心问题非常明确——Informix JDBC驱动因为自动提交(autocommit)开启,导致ResultSet在Datanucleus尝试读取前就被关闭了。最底层的SQLException已经给出了关键提示:
java.sql.SQLException: ResultSet not open, operation 'next' not permitted. Verify that autocommit is OFF
当autocommit处于开启状态时,Informix的JDBC驱动会在执行完SQL语句后立即提交事务,并关闭对应的ResultSet和Statement。而Datanucleus的查询结果处理逻辑(比如ForwardQueryResult)会在连接即将关闭时才去读取剩余结果,这时候ResultSet已经被驱动关闭,自然拿不到数据。
推荐的解决步骤:
修改JDBC连接URL:在连接参数中强制关闭autocommit,比如:
jdbc:informix-sqli://your-host:your-port/your-db:INFORMIXSERVER=your-server;autocommit=false;配置Datanucleus持久化属性:在
persistence.xml中添加以下配置,确保框架层面禁用自动提交:<property name="datanucleus.connection.autocommit" value="false"/>代码层面确认:如果你的代码中有手动获取连接的逻辑,确保显式设置:
Connection conn = ...; conn.setAutoCommit(false);额外检查:可以尝试设置Datanucleus的结果集类型配置,让结果集保持打开状态(不过这只是辅助,核心还是autocommit):
<property name="datanucleus.rdbms.query.resultSetType" value="TYPE_SCROLL_INSENSITIVE"/>
你提到升级/降级Datanucleus版本没用,这很合理,因为本质是JDBC驱动和事务提交策略的冲突,和框架版本关系不大。
完整堆栈跟踪信息:
javax.jdo.JDOUserException: Exception thrown while loading remaining rows of query at org.datanucleus.api.jdo.JDOAdapter.getUserExceptionForException(JDOAdapter.java:670) at org.datanucleus.store.rdbms.query.ForwardQueryResult.closingConnection(ForwardQueryResult.java:310) at org.datanucleus.store.query.AbstractQueryResult.disconnect(AbstractQueryResult.java:105) at org.datanucleus.store.rdbms.query.AbstractRDBMSQueryResult.disconnect(AbstractRDBMSQueryResult.java:248) at org.datanucleus.store.rdbms.query.JDOQLQuery$2.managedConnectionPreClose(JDOQLQuery.java:734) at org.datanucleus.store.rdbms.ConnectionFactoryImpl$ManagedConnectionImpl.close(ConnectionFactoryImpl.java:519) at org.datanucleus.store.connection.AbstractManagedConnection.release(AbstractManagedConnection.java:83) at org.datanucleus.store.rdbms.ConnectionFactoryImpl$ManagedConnectionImpl.release(ConnectionFactoryImpl.java:353) at org.datanucleus.store.rdbms.query.JDOQLQuery.performExecute(JDOQLQuery.java:809) at org.datanucleus.store.query.Query.executeQuery(Query.java:1926) at org.datanucleus.store.query.Query.executeWithArray(Query.java:1815) at org.datanucleus.api.jdo.JDOQuery.executeInternal(JDOQuery.java:431) at org.datanucleus.api.jdo.JDOQuery.executeWithArray(JDOQuery.java:318) at com.swanretail.server.service.LocalClientPM.execute(LocalClientPM.java:143) at com.swanretail.service.Context.execute(Context.java:408) at com.swanretail.service.QueryBuilder.execute(QueryBuilder.java:286) at com.swanretail.service.SystemService.getLicencedUsers(SystemService.java:1930) at com.swanretail.jdo.Main.main(Main.java:99) NestedThrowablesStackTrace: javax.jdo.JDODataStoreException: Failed to read the result set : ResultSet not open, operation 'next' not permitted. Verify that autocommit is OFF at org.datanucleus.api.jdo.JDOAdapter.getDataStoreExceptionForException(JDOAdapter.java:681) at org.datanucleus.store.rdbms.query.ForwardQueryResult.nextResultSetElement(ForwardQueryResult.java:238) at org.datanucleus.store.rdbms.query.ForwardQueryResult$QueryResultIterator.next(ForwardQueryResult.java:416) at org.datanucleus.store.rdbms.query.ForwardQueryResult.processNumberOfResults(ForwardQueryResult.java:143) at org.datanucleus.store.rdbms.query.ForwardQueryResult.advanceToEndOfResultSet(ForwardQueryResult.java:171) at org.datanucleus.store.rdbms.query.ForwardQueryResult.closingConnection(ForwardQueryResult.java:298) at org.datanucleus.store.query.AbstractQueryResult.disconnect(AbstractQueryResult.java:105) at org.datanucleus.store.rdbms.query.AbstractRDBMSQueryResult.disconnect(AbstractRDBMSQueryResult.java:248) at org.datanucleus.store.rdbms.query.JDOQLQuery$2.managedConnectionPreClose(JDOQLQuery.java:734) at org.datanucleus.store.rdbms.ConnectionFactoryImpl$ManagedConnectionImpl.close(ConnectionFactoryImpl.java:519) at org.datanucleus.store.connection.AbstractManagedConnection.release(AbstractManagedConnection.java:83) at org.datanucleus.store.rdbms.ConnectionFactoryImpl$ManagedConnectionImpl.release(ConnectionFactoryImpl.java:353) at org.datanucleus.store.rdbms.query.JDOQLQuery.performExecute(JDOQLQuery.java:809) at org.datanucleus.store.query.Query.executeQuery(Query.java:1926) at org.datanucleus.store.query.Query.executeWithArray(Query.java:1815) at org.datanucleus.api.jdo.JDOQuery.executeInternal(JDOQuery.java:431) at org.datanucleus.api.jdo.JDOQuery.executeWithArray(JDOQuery.java:318) at com.swanretail.server.service.LocalClientPM.execute(LocalClientPM.java:143) at com.swanretail.service.Context.execute(Context.java:408) at com.swanretail.service.QueryBuilder.execute(QueryBuilder.java:286) at com.swanretail.service.SystemService.getLicencedUsers(SystemService.java:1930) at com.swanretail.jdo.Main.main(Main.java:99) NestedThrowablesStackTrace: java.sql.SQLException: ResultSet not open, operation 'next' not permitted. Verify that autocommit is OFF at com.informix.util.IfxErrMsg.buildException(IfxErrMsg.java:480) at com.informix.util.IfxErrMsg.getSQLException(IfxErrMsg.java:449) at com.informix.util.IfxErrMsg.getSQLException(IfxErrMsg.java:400) at com.informix.jdbc.IfxResultSet.next(IfxResultSet.java:442) at org.datanucleus.store.rdbms.query.ForwardQueryResult.nextResultSetElement(ForwardQueryResult.java:220) at org.datanucleus.store.rdbms.query.ForwardQueryResult$QueryResultIterator.next(ForwardQueryResult.java:416) at org.datanucleus.store.rdbms.query.ForwardQueryResult.processNumberOfResults(ForwardQueryResult.java:143) at org.datanucleus.store.rdbms.query.ForwardQueryResult.advanceToEndOfResultSet(ForwardQueryResult.java:171) at org.datanucleus.store.rdbms.query.ForwardQueryResult.closingConnection(ForwardQueryResult.java:298) at org.datanucleus.store.query.AbstractQueryResult.disconnect(AbstractQueryResult.java:105) at org.datanucleus.store.rdbms.query.AbstractRDBMSQueryResult.disconnect(AbstractRDBMSQueryResult.java:248) at org.datanucleus.store.rdbms.query.JDOQLQuery$2.managedConnectionPreClose(JDOQLQuery.java:734) at org.datanucleus.store.rdbms.ConnectionFactoryImpl$ManagedConnectionImpl.close(ConnectionFactoryImpl.java:519) at org.datanucleus.store.connection.AbstractManagedConnection.release(AbstractManagedConnection.java:83) at org.datanucleus.store.rdbms.ConnectionFactoryImpl$ManagedConnectionImpl.release(ConnectionFactoryImpl.java:353) at org.datanucleus.store.rdbms.query.JDOQLQuery.performExecute(JDOQLQuery.java:809) at org.datanucleus.store.query.Query.executeQuery(Query.java:1926) at org.datanucleus.store.query.Query.executeWithArray(Query.java:1815) at org.datanucleus.api.jdo.JDOQuery.executeInternal(JDOQuery.java:431) at org.datanucleus.api.jdo.JDOQuery.executeWithArray(JDOQuery.java:318) at com.swanretail.server.service.LocalClientPM.execute(LocalClientPM.java:143) at com.swanretail.service.Context.execute(Context.java:408) at com.swanretail.service.QueryBuilder.execute(QueryBuilder.java:286) at com.swanretail.service.SystemService.getLicencedUsers(SystemService.java:1930) at com.swanretail.jdo.Main.main(Main.java:99)
内容的提问来源于stack exchange,提问作者Victor Tichayana Hokonya
相关产品推荐
相关产品推荐

