应用程序未加载来自休眠的数据

时间:2015-11-26 11:59:06

标签: spring hibernate jpa jar weblogic12c

我们的应用程序有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而导致第二个服务器发生冲突

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

1 个答案:

答案 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中激活它。

然后它正常工作。