Java AS400 «Внутренняя ошибка драйвера» с консольным приложением

1

У меня есть консольное приложение Java 1.6 (это не веб-приложение), работающее на AS400. Внутренние элементы Hibernate 3.6.10 и Spring 3.2.1. Мы используем IBM Java Toolbox jt400 версии 6.6.

Приложение считывает несколько строк из базы данных DB2, используя очень большой многопользовательский запрос (сгенерированный Hibernate), который превышает 4700 символов. На данный момент он пытается с нетерпением инициализировать коллекцию, которая зависает от основной записи. EDIT: Упс, похоже, что это не зависит от данных: я удалил оскорбительную запись, и она быстро провалилась на следующем.

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]

Разве он просто не возвращает пустой список результатов? Кто-нибудь сталкивался с этим раньше? Это новое поведение - этот код использовался для работы, но это новая версия (однако ни одно из этого не должно было измениться).

Теги:
spring
hibernate
ibm-midrange
db2-400

1 ответ

2
Лучший ответ

Быстрый взгляд на newData метод SQLDataFactory.java, кажется, указывает неверный собственный тип данных:

/**
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.
**/

Я бы обновил до последней версии библиотеки и посмотрел, исправляет ли она эту проблему.

  • 0
    Я должен добавить, что основная проблема заключалась в том, что AS400 не только использует специальную версию этой библиотеки "jt400Native.jar", но и что кто-то скопировал ее крайне нестандартную версию в нестандартное расположение на нашей машине AS400 / iSeries, поэтому было практически невозможно определить, в чем именно заключалась проблема, без дополнительной детективной работы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню