ibatis-user-java mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Mauricio Cáceres" <mauricio.cacere...@gmail.com>
Subject Re: java.lang.StackOverflowError
Date Tue, 26 Feb 2008 14:18:15 GMT
>
> Hi,
>
>  We have installed Ibatis version ibatis-2.3.0.677.jar in our enviroments
> (*Weblogic 8 SP 5, jdk142_08*). This work fine in Development and
> Production environment. However in Test Environment this throw
> java.lang.StackOverflowError (only sometimes) when I execute the method
> queryForObject or queryForList on SqlMapClient class.
>
>   I did many test on this environment for to know the problem, the log on
> the server was Exception in
> com.ibatis.common.jdbc.logging.PreparedStatementLogProxy in the method
> newInstance.
>
>   public static PreparedStatement newInstance(PreparedStatement stmt,
> String sql) {
>     InvocationHandler handler = new PreparedStatementLogProxy(stmt, sql);
>     ClassLoader cl = PreparedStatement.class.getClassLoader();
>     return (PreparedStatement) Proxy.newProxyInstance(cl, new Class[]{
> PreparedStatement.class, CallableStatement.class}, handler);
>   }
>
>
> I think the problem is how you get classloader. However I not change this
> code and change the ConnectionLogProxy in method invoke for not call this
> line stmt = PreparedStatementLogProxy.newInstance(stmt, (String)
> params[0]);.
>
> This is my new class. Please I need to know why
> java.lang.StackOverflowError is throw when this line is call (stmt =
> PreparedStatementLogProxy.newInstance(stmt, (String) params[0]); on class
> com.ibatis.common.jdbc.logging.ConnectionLogProxy). *The method invoke on
> PreparedStatementLogProxy is call in infinite loop.*
>
> /*
>  *  Copyright 2004 Clinton Begin
>  *
>  *  Licensed under the Apache License, Version 2.0 (the "License");
>  *  you may not use this file except in compliance with the License.
>  *  You may obtain a copy of the License at
>  *
>  *      http://www.apache.org/licenses/LICENSE-2.0
>  *
>  *  Unless required by applicable law or agreed to in writing, software
>  *  distributed under the License is distributed on an "AS IS" BASIS,
>  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
>  *  See the License for the specific language governing permissions and
>  *  limitations under the License.
>  */
> package com.ibatis.common.jdbc.logging;
>
> import com.ibatis.common.beans.ClassInfo;
> import com.ibatis.common.logging.Log;
> import com.ibatis.common.logging.LogFactory;
>
> import java.lang.reflect.InvocationHandler;
> import java.lang.reflect.Method;
> import java.lang.reflect.Proxy;
> import java.sql.Connection;
> import java.sql.PreparedStatement;
> import java.sql.Statement;
>
> /**
>  * Connection proxy to add logging
>  */
> public class ConnectionLogProxy extends BaseLogProxy implements
> InvocationHandler {
>
>   private static final Log log = LogFactory.getLog(Connection.class);
>
>   private Connection connection;
>
>   private ConnectionLogProxy(Connection conn) {
>     super();
>     this.connection = conn;
>     if (log.isDebugEnabled()) {
>       log.debug("{conn-" + id + "} Connection");
>     }
>   }
>
>   public Object invoke(Object proxy, Method method, Object[] params)
>       throws Throwable {
>     try {
>       if ("prepareStatement".equals(method.getName())) {
>         if (log.isDebugEnabled()) {
>           log.debug("{conn-" + id + "} Preparing Statement: " +
> removeBreakingWhitespace((String) params[0]));
>         }
>         PreparedStatement stmt = (PreparedStatement) method.invoke(connection,
> params);
>         log.debug("params[0]------->"+params[0]);
>         //stmt = PreparedStatementLogProxy.newInstance(stmt, (String)
> params[0]);
>         return stmt;
>       }
>       else if ("prepareCall".equals(method.getName())) {
>         if (log.isDebugEnabled()) {
>           log.debug("{conn-" + id + "} Preparing Call: " +
> removeBreakingWhitespace((String) params[0]));
>         }
>         PreparedStatement stmt = (PreparedStatement) method.invoke(connection,
> params);
>         log.debug("params[0]------->"+params[0]);
>         //stmt = PreparedStatementLogProxy.newInstance(stmt, (String)
> params[0]);
>         return stmt;
>       }
>       else if ("createStatement".equals(method.getName())) {
>         Statement stmt = (Statement) method.invoke(connection, params);
>         stmt = StatementLogProxy.newInstance(stmt);
>         return stmt;
>       } else {
>         return method.invoke(connection, params);
>       }
>     }
>     catch (Throwable t) {
>       Throwable t1 = ClassInfo.unwrapThrowable(t);
>       log.error("Error calling Connection." + method.getName() + ':', t1);
>       throw t1;
>     }
>
>   }
>
>   /**
>    * Creates a logging version of a connection
>    * @param conn - the original connection
>    * @return - the connection with logging
>    */
>   public static Connection newInstance(Connection conn) {
>     InvocationHandler handler = new ConnectionLogProxy(conn);
>     ClassLoader cl = Connection.class.getClassLoader();
>     return (Connection) Proxy.newProxyInstance(cl, new Class[]{
> Connection.class}, handler);
>   }
>
> }
>
>
>
>
>

Mime
View raw message