应用程序未从休眠加载数据

Application not loading data from hibernate

我们的应用程序有 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(自定义Loader.java:312) 在 org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1722) 在 org.hibernate.impl.AbstractSessionImpl.list(摘要SessionImpl.java:165) 在 org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:175)

所以我直接在hibernate-3.2.7.ga jar 文件中Oracle8iDialect.java 中查看方言代码。

Hibernate 使用以下代码加载 ORACLE TYPES class.

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 值时出现问题”,所以我调查了还有一个 class 在 z_easybeans-uberjar-hibernate-1.1.0-M3-JONAS.jar 文件中使用同名 Oracle8iDialect。我认为 class 加载程序在两个 jar 文件之间存在相同的 class 冲突。所以在运行时 web 逻辑在 z_easybeans-uberjar-hibernate-1.1.0-M3-JONAS.jar 中选择 oracle8idialect class 文件而不是在 hibernate-3.2.7.ga jar 中正确的 class .

方言代码在Oracle8iDialect.java里面z_easybeans-uberjar-hibernate-1.1.0-M3-JONAS.jar.

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,这会导致第二台服务器发生冲突

任何人请为我们提供解决此问题的方法。

我在朋友的帮助下找到了答案。

更改了 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;
                }

并编译了特定的方言文件,并在删除旧的 class 文件

后将 class 文件添加到 z_easybeans-uberjar-hibernate-1.1.0-M3-JONAS.jar

然后制作 war 并从 weblogic 激活它。

然后就正常了