Desarrollo aplicaciones usando Tomcat 6.0, mybatis y Oracle XAPool. Cuando ejecuto la aplicación, se genera el siguiente seguimiento de pila.

2012-05-10 16:19:16,328 ERROR [jatis.avantrade.foundation.model.dao.DAOHelper] [t] -  datasource jndi : org.enhydra.jdbc.pool.StandardXAPoolDataSource
2012-05-10 16:19:16,328 ERROR [jatis.avantrade.foundation.model.dao.DAOHelper] [t] -   org.enhydra.jdbc.pool.StandardXAPoolDataSource cannot be cast to org.enhydra.jdbc.pool.StandardXAPoolDataSource
java.lang.ClassCastException: org.enhydra.jdbc.pool.StandardXAPoolDataSource cannot be cast to org.enhydra.jdbc.pool.StandardXAPoolDataSource
at jatis.avantrade.foundation.model.dao.DAOHelper.getSession(DAOHelper.java:73)

A continuación se muestra el código DAOHelper cuando se obtiene la sesión de la base de datos. Cuando imprimo fuente de datos muestra el tipo que es StandardXAPoolDataSource. El comportamiento extraño es que el show de stacktrace org.enhydra.jdbc.pool.StandardXAPoolDataSource no se puede convertir a org.enhydra.jdbc.pool.StandardXAPoolDataSource.

¿La misma clase no puede lanzarse a sí misma?

protected SqlSession getSession() {SqlSession session = sessionLocal.get();
if (session == null) {
 ConfigurationManager configurationManager = ConfigurationManagerSupport   .getConfigurationManager(5000);
RootContextConfiguration contextConfiguration = (RootContextConfiguration) configurationManager
                .getContextConfiguration(RootContextConfiguration.CONTEXT);

        session = contextConfiguration.getMyBatisSession(MYBATIS_ID);
        log.error("data source : "
                + session.getConfiguration().getEnvironment()
                        .getDataSource());
        log.error("connection : " + session.getConnection());

        sessionLocal.set(session);
        log.error("factory : "
                + session.getConfiguration().getEnvironment()
                        .getTransactionFactory());

        String DATASOURCE_CONTEXT = "java:comp/env/jdbc/avantrade";

        Connection result = null;
        try {
            Context initialContext = new InitialContext();
            DataSource datasource = (DataSource) initialContext
                    .lookup(DATASOURCE_CONTEXT);
            log.error("datasource jndi : " + datasource);
            log.error("datasource jndi : " + datasource.getClass().getName());
            log.error("datasource jndi name : " + ((StandardXAPoolDataSource) datasource).getDataSourceName());
            log.error("datasource jndi connection : " + ((StandardXAPoolDataSource) datasource).getConnection());
            {
                result = datasource.getConnection();
                log.error("connection jndi : " + result);
                log.error("connection jndi : " + result.getClass().getName());

            }
        } catch (NamingException ex) {
            log.error(ex.getMessage(), ex);
        } catch (SQLException ex) {
            log.error(ex.getMessage(), ex);
        } catch (Exception ex) {
            log.error(ex.getMessage(), ex);
        }

    }

    return session;

}

Gracias.

1
Iswanto San 10 may. 2012 a las 13:36

1 respuesta

La mejor respuesta

¿La misma clase no puede lanzarse a sí misma?

Esto generalmente se debe a que dos cargadores de clases diferentes cargan dos copias de la misma clase. La causa raíz más común es que el servidor de aplicaciones tiene una copia y su aplicación tiene otra.

Compruebe los archivos JAR que se encuentran en los directorios lib de Tomcat y el directorio lib de su aplicación. Solo debería tener una copia de ellos.

1
skaffman 10 may. 2012 a las 15:02