我们的应用程序有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) at 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而导致第二个服务器发生冲突
任何人请为我们提供此问题的解决方案。
答案 0 :(得分:1)
我在朋友的帮助下找到了答案。
在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.OracleTypes**");
oracletypes_cursor_value = types.getField("CURSOR").getInt(**null**);
} 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;
}
编译特定的方言文件,并在删除旧的类文件后将类文件添加到z_easybeans-uberjar-hibernate-1.1.0-M3-JONAS.jar
然后制作战争并从weblogic中激活它。
然后它正常工作。