2012-05-10 8 views
1

Tomcat 6.0、mybatis、およびOracle XAPoolを使用してアプリケーションを開発します。 私はアプリケーションを実行すると、次のスタックトレースが生成されます。XAプールのClassCastException

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

} 

ありがとうございます。

答えて

1

同じクラスは自分自身にキャストできません。

これは、通常、同じクラスの2つのコピーが2つの異なるクラスローダーによって読み込まれるために発生します。最も一般的な根本的な原因は、アプリケーションサーバーにコピーが1つあり、アプリケーションに別のコピーがあることです。

Tomcat独自のlibディレクトリに保存されているJARと、アプリのlibディレクトリを確認します。あなたはそれらのコピーを1つだけ持っているべきです。

+0

ありがとうございました。それは仕事です。 :) –