【发布时间】:2016-02-29 12:29:23
【问题描述】:
我们的应用程序有 2 个服务器 A 和 B,请求由负载平衡器管理。 两个 weblogic 服务器中的代码相同,但是 当从一台服务器加载同一页面时,它会显示 但是从第二台服务器加载的同一页面给出了
错误 500--内部服务器错误
war 文件在两个 weblogic 服务器中是相同的,但是当我检查日志时,我可以看到观察到一些异常。
org.hibernate.HibernateException:尝试加载或访问 OracleTypes.CURSOR 值时出现问题 在 org.hibernate.dialect.Oracle8iDialect.registerResultSetOutParameter(Oracle8iDialect.java:399) 在 org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1586) 在 org.hibernate.loader.Loader.doQuery(Loader.java:696) 在 org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259) 在 org.hibernate.loader.Loader.doList(Loader.java:2228) 在 org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2125) 在 org.hibernate.loader.Loader.list(Loader.java:2120) 在 org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:312) 在 org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1722) 在 org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:165) 在 org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:175)
所以我直接浏览了hibernate-3.2.7.ga jar文件中Oracle8iDialect.java中的方言代码。
Hibernate 使用以下代码加载 ORACLE TYPES 类。
public int registerResultSetOutParameter(CallableStatement statement, int col) throws SQLException {
// register the type of the out param - an Oracle specific type
statement.registerOutParameter( col, getOracleCursorTypeSqlType() );
col++;
return col;
}
因此,Oracle8iDialect.java 中没有代码描述会引发上述异常“尝试加载或访问 OracleTypes.CURSOR 值时出现问题”,因此我调查了 z_easybeans 中还有一个同名的 Oracle8iDialect 类- uberjar-hibernate-1.1.0-M3-JONAS.jar 文件。我认为类加载器在两个 jar 文件之间存在相同的类冲突。因此,在运行时 Web 逻辑会在 z_easybeans-uberjar-hibernate-1.1.0-M3-JONAS.jar 中获取 oracle8idialect 类文件,而不是在 hibernate-3.2.7.ga jar 中获取正确的类。
z_easybeans-uberjar-hibernate-1.1.0-M3-JONAS.jar 中 Oracle8iDialect.java 中的方言代码。
public int registerResultSetOutParameter(java.sql.CallableStatement statement,int col) throws SQLException {
if(oracletypes_cursor_value==0) {
try {
Class types = ReflectHelper.classForName("oracle.jdbc.driver.OracleTypes");
oracletypes_cursor_value = types.getField("CURSOR").getInt(types.newInstance());
} catch (Exception se) {
throw new HibernateException("Problem while trying to load or access OracleTypes.CURSOR value",se);
}
}
// register the type of the out param - an Oracle specific type
statement.registerOutParameter(col, oracletypes_cursor_value);
col++;
return col;
}
可能是这个jar中使用了不同版本的hibernate,导致第二个服务器发生冲突
任何人请为我们提供此问题的解决方案。
【问题讨论】:
标签: spring hibernate jpa jar weblogic12c