Question

I develop application using Tomcat 6.0, mybatis and Oracle XAPool. When i run application, the following stacktrace is generated.

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)

Below is DAOHelper code when get database session. When i print datasource it show the type it's StandardXAPoolDataSource. The strange behavior is that the stacktrace show org.enhydra.jdbc.pool.StandardXAPoolDataSource cannot be cast to org.enhydra.jdbc.pool.StandardXAPoolDataSource.

The same class cannot cast to itself?

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;

}

Thanks.

Was it helpful?

Solution

The same class cannot cast to itself?

This is usually caused by two copies of the same class being loaded by two different classloaders. The most common root cause is that the appserver has one copy, and your application has another.

Check the JARs held by Tomcat's own lib directories, and your app's lib directory. You should only have one copy of them.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top