>
> 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);
> }
>
> }
>
>
>
>
>