Java AS400“内部驱动程序错误”与控制台应用程序

时间:2014-05-31 01:33:42

标签: java spring hibernate ibm-midrange db2-400

我在AS400上运行了一个Java 1.6控制台应用程序(这是一个Web应用程序)。内部是Hibernate 3.6.10和Spring 3.2.1。我们使用的是IBM的Java Toolbox jt400版本6.6。

应用程序使用非常大的多表查询(由Hibernate生成)从DB2数据库中读取多行,其长度超过4700个字符。在这一点上,它正试图急切地初始化一个挂在主记录上的集合。 编辑:哎呀,看起来它不依赖于数据:我删除了有问题的记录,并且在下一个记录中它很快就失败了。

DEBUG Thread-0 org.hibernate.util.JDBCExceptionReporter  - could not initialize a collection: com.myapp.model.MyAppMaster.myAppOwners#36

java.sql.SQLException: Internal driver error.(908)
at java.lang.Throwable.<init>(Throwable.java:196)
at java.lang.Exception.<init>(Exception.java:41)
at java.sql.SQLException.<init>(SQLException.java:52)
at com.ibm.as400.access.JDError.throwSQLException(JDError.java:480)
at com.ibm.as400.access.SQLDataFactory.newData(SQLDataFactory.java:602)
at com.ibm.as400.access.JDServerRow.initialize(JDServerRow.java:228)
at com.ibm.as400.access.JDServerRow.<init>(JDServerRow.java:106)
at com.ibm.as400.access.AS400JDBCStatement.commonPrepare(AS400JDBCStatement.java:1385)
at com.ibm.as400.access.AS400JDBCPreparedStatement.<init>(AS400JDBCPreparedStatement.java:256)
at com.ibm.as400.access.AS400JDBCConnection.prepareStatement(AS400JDBCConnection.java:1881)
at com.ibm.as400.access.AS400JDBCConnection.prepareStatement(AS400JDBCConnection.java:1711)
at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:534)
at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:452)
at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:161)
at net.bull.javamelody.HibernateBatcherFactory$HibernateBatchingBatcher.prepareQueryStatement(HibernateBatcherFactory.java:71)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1700)
at org.hibernate.loader.Loader.doQuery(Loader.java:801)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274)
at org.hibernate.loader.Loader.loadCollection(Loader.java:2166)
at org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:62)
at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:627)
at org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:83)
at org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1863)
at org.hibernate.collection.AbstractPersistentCollection.forceInitialization(AbstractPersistentCollection.java:479)
at org.hibernate.engine.StatefulPersistenceContext.initializeNonLazyCollections(StatefulPersistenceContext.java:900)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:279)
at org.hibernate.loader.Loader.doList(Loader.java:2542)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276)
at org.hibernate.loader.Loader.list(Loader.java:2271)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:459)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:365)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1268)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:246)
[snip]

它不应该只是返回一个空的结果列表吗?有没有人遇到这个?这是新的行为 - 这段代码曾经有用,但这是一个新版本(但是,这一切都不应该改变。)

1 个答案:

答案 0 :(得分:2)

快速查看SQLDataFactory.javanewData方法似乎表明无效的原生数据类型:

/**
Return a SQLData object corresponding to the
specific IBM i native type string.

@param nativeType An IBM i native type.
@param length Length of data (in bytes).
@param precision Precision of data.
@param scale Scale of data.
@param settings The conversion settings.
@return A SQLData object.

@exception SQLException If no valid type can be
mapped.
**/

我会更新到库的latest version,看看是否能解决问题。