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.
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.