1

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

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。奇妙な動作は、スタック トレース ショー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;

}

ありがとう。

4

1 に答える 1

1

同じクラスはそれ自体にキャストできませんか?

これは通常、同じクラスの 2 つのコピーが 2 つの異なるクラスローダによってロードされることが原因です。最も一般的な根本的な原因は、appserver に 1 つのコピーがあり、アプリケーションに別のコピーがあることです。

Tomcat 自身のlibディレクトリとアプリのlibディレクトリに保持されている JAR を確認してください。それらのコピーを 1 つだけ持つ必要があります。

于 2012-05-10T11:02:09.577 に答える