使用JNDI查找XADatasource时发生异常

时间:2018-10-08 22:00:02

标签: spring-boot spring-data-jpa datasource jta atomikos

我已在Wildlfy服务器中配置了XADatasource,因为我需要使用JTA事务,并且需要使用Atomikos实现使用JTATransactionManager管理多个数据库。查找并使用Spring Boot构建AtomikosDatasource时,出现以下ClassCastException异常。似乎JNDI查找总是返回WildflyDatasource,并且它没有实现XADatasource。请建议我在查找时如何获取XADatasource而不是WildflyDatasource,或者从WildlfyDatasource转换为XADatasource。

原因:java.lang.ClassCastException:org.jboss.as.connector.subsystems.datasources.WildFlyDataSource无法转换为javax.sql.XADataSource

下面是查找数据源并创建AtomikosDataSourceBean的代码段

*@Bean(name = "customerDataSource", initMethod = "init", destroyMethod = "close")
@Primary
public DataSource customerDataSource() throws NamingException {     
    JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
    XADataSource mysqlXaDataSource =  (XADataSource) dataSourceLookup.getDataSource("java:/jdbc/atomikos_one");
    AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();
    xaDataSource.setXaDataSource(mysqlXaDataSource);        
    xaDataSource.setUniqueResourceName("xads1");
    return xaDataSource;
}*

下面是Wildfly 10.1.0.Final中的数据源配置

    <xa-datasource jndi-name="java:/jdbc/atomikos_one" pool-name="atomikos_one" enabled="true" use-ccm="true">
                <xa-datasource-property name="ServerName">
                    localhost
                </xa-datasource-property>
                <xa-datasource-property name="DatabaseName">
                    atomikos_one
                </xa-datasource-property>
                <driver>mysql</driver>
                <xa-pool>
                    <min-pool-size>5</min-pool-size>
                    <max-pool-size>100</max-pool-size>
                    <use-strict-min>true</use-strict-min>
                    <wrap-xa-resource>false</wrap-xa-resource>
                </xa-pool>
                <security>
                    <user-name>root</user-name>
                    <password>password</password>
                </security>
                <validation>
                    <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLValidConnectionChecker"/>
                    <background-validation>true</background-validation>
                    <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLExceptionSorter"/>
                </validation>
            </xa-datasource>
            <driver name="mysql" module="com.mysql">
                <driver-class>com.mysql.jdbc.Driver</driver-class>
                <xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class>
            </driver>

2 个答案:

答案 0 :(得分:0)

奇怪。

那么,如果尝试以下操作会发生什么:

Object o = dataSourceLookup.getDataSource("java:/jdbc/atomikos_one");
System.out.println(o.getClass());

打印什么类别名称?

答案 1 :(得分:0)

使其正常工作。我已经意识到,内置的JTA TransactionManagers已在应用程序服务器中可用并且正在使用它,而不是进行自定义实现(Atomikos)。     来到这个问题的答案,我们仍然可以在应用服务器中配置XADatasoruce并使用JNDI查找,并将其类型转换为普通数据源并将其注入EntityManager。     即使类型为数据源,mysqlXaDataSource仍将保留对XA-Datasource的引用。

{{1}}