我使用Tomcat 6.0,mybatis和Oracle XAPool开发应用程序。
当我运行应用程序时,将生成以下stacktrace。
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)
下面是获取数据库会话时的DAOHelper代码。当我打印时
数据源显示其类型为
StandardXAPoolDataSource
。奇怪的行为是stacktrace show
org.enhydra.jdbc.pool.StandardXAPoolDataSource
无法转换为org.enhydra.jdbc.pool.StandardXAPoolDataSource
。同一个阶级不能自尽吗?
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;
}
谢谢。
最佳答案
同一个阶级不能自尽吗?
这通常是由两个不同的类加载器加载相同类的两个副本引起的。最常见的根本原因是应用程序服务器有一个副本,而您的应用程序有另一个副本。
检查由Tomcat自己的lib
目录和应用程序的lib
目录保存的JAR。您应该只有一份。