我已在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>
答案 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}}