Transactions 如何从WebSphere6.1上托管的DB2数据库获取XADatasource

Transactions 如何从WebSphere6.1上托管的DB2数据库获取XADatasource,transactions,db2,websphere,jndi,jta,Transactions,Db2,Websphere,Jndi,Jta,我正在处理分布式事务。我正在尝试使用Atomikos作为事务管理器来实现XA事务。我的问题之一是能够从WebSphere6.1服务器上托管的DB2数据库中获取“XADataSource”。 我使用jndi查找来获取数据源,如下所示: Context ctx=new InitialContext(); XADataSource ds = (XADataSource) ctx.lookup(dataSourceName); 但是,此查找会导致以下异常: [3/21/12 12:08:47:551

我正在处理分布式事务。我正在尝试使用Atomikos作为事务管理器来实现XA事务。我的问题之一是能够从WebSphere6.1服务器上托管的DB2数据库中获取“XADataSource”。 我使用jndi查找来获取数据源,如下所示:

Context ctx=new InitialContext();
XADataSource ds = (XADataSource) ctx.lookup(dataSourceName);
但是,此查找会导致以下异常:

[3/21/12 12:08:47:551 EDT] 00000026 SystemErr     R java.lang.ClassCastException: com.ibm.ws.rsadapter.jdbc.WSJdbcDataSource incompatible with javax.sql.XADataSource
[3/21/12 12:08:47:551 EDT] 00000026 SystemErr     R     at com.BusinessEntities.JndiConn.<init>(JndiConn.java:21)
[3/21/12 12:08:47:551 EDT] 00000026 SystemErr     R     at com.Servlet.InitialServlet.doGet(InitialServlet.java:41)
[3/21/12 12:08:47:551 EDT] 00000026 SystemErr     R     at com.Servlet.InitialServlet.doPost(InitialServlet.java:186)
[3/21/12 12:08:47:551 EDT] 00000026 SystemErr     R     at javax.servlet.http.HttpServlet.service(HttpServlet.java:763)
[3/21/12 12:08:47:551 EDT] 00000026 SystemErr     R     at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
[3/21/12 12:08:47:551 EDT] 00000026 SystemErr     R     at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1101)
[3/21/12 12:08:47:566 EDT] 00000026 SystemErr     R     at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:569)
[3/21/12 12:08:47:566 EDT] 00000026 SystemErr     R     at com.ibm.ws.wswebcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:478)
[3/21/12 12:08:47:566 EDT] 00000026 SystemErr     R     at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:3440)
[3/21/12 12:08:47:566 EDT] 00000026 SystemErr     R     at com.ibm.ws.webcontainer.webapp.WebGroup.handleRequest(WebGroup.java:267)
[3/21/12 12:08:47:566 EDT] 00000026 SystemErr     R     at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:815)
[3/21/12 12:08:47:566 EDT] 00000026 SystemErr     R     at com.ibm.ws.wswebcontainer.WebContainer.handleRequest(WebContainer.java:1461)
[3/21/12 12:08:47:566 EDT] 00000026 SystemErr     R     at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:118)
[3/21/12 12:08:47:566 EDT] 00000026 SystemErr     R     at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:458)
[3/21/12 12:08:47:566 EDT] 00000026 SystemErr     R     at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewInformation(HttpInboundLink.java:387)
[3/21/12 12:08:47:566 EDT] 00000026 SystemErr     R     at com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:102)
[3/21/12 12:08:47:566 EDT] 00000026 SystemErr     R     at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165)
[3/21/12 12:08:47:566 EDT] 00000026 SystemErr     R     at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
[3/21/12 12:08:47:566 EDT] 00000026 SystemErr     R     at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
[3/21/12 12:08:47:566 EDT] 00000026 SystemErr     R     at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:136)
[3/21/12 12:08:47:566 EDT] 00000026 SystemErr     R     at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:195)
[3/21/12 12:08:47:566 EDT] 00000026 SystemErr     R     at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:743)
[3/21/12 12:08:47:566 EDT] 00000026 SystemErr     R     at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:873)
[3/21/12 12:08:47:566 EDT] 00000026 SystemErr     R     at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1473)
[3/21/12 12:08:47:551 EDT]00000026 SystemErr R java.lang.ClassCastException:com.ibm.ws.rsadapter.jdbc.WSJdbcDataSource与javax.sql.XADataSource不兼容
[3/21/12 12:08:47:551 EDT]00000026 SystemErr R位于com.BusinessEntities.JndiConn.(JndiConn.java:21)
[3/21/12 12:08:47:551 EDT]00000026 SystemErr R位于com.Servlet.InitialServlet.doGet(InitialServlet.java:41)
[3/21/12 12:08:47:551 EDT]00000026 SystemErr R位于com.Servlet.InitialServlet.doPost(InitialServlet.java:186)
[3/21/12 12:08:47:551 EDT]00000026 SystemErr R位于javax.servlet.http.HttpServlet.service(HttpServlet.java:763)
[3/21/12 12:08:47:551 EDT]00000026 SystemErr R位于javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
[3/21/12 12:08:47:551 EDT]00000026 SystemErr R位于com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1101)
[3/21/12 12:08:47:566 EDT]00000026 SystemErr R位于com.ibm.ws.webcontainer.servlet.ServletWrapper.HandlerRequest(ServletWrapper.java:569)
[3/21/12 12:08:47:566 EDT]00000026 SystemErr R位于com.ibm.ws.wswebcontainer.servlet.ServletWrapper.HandlerRequest(ServletWrapper.java:478)
[3/21/12 12:08:47:566 EDT]00000026 SystemErr R位于com.ibm.ws.webcontainer.webapp.webapp.handleRequest(webapp.java:3440)
[3/21/12 12:08:47:566 EDT]00000026 SystemErr R位于com.ibm.ws.webcontainer.webapp.WebGroup.handleRequest(WebGroup.java:267)
[3/21/12 12:08:47:566 EDT]00000026 SystemErr R位于com.ibm.ws.webcontainer.webcontainer.handleRequest(webcontainer.java:815)
[3/21/12 12:08:47:566 EDT]00000026 SystemErr R位于com.ibm.ws.wswebcontainer.WebContainer.handleRequest(WebContainer.java:1461)
[3/21/12 12:08:47:566 EDT]00000026 SystemErr R位于com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:118)
[3/21/12 12:08:47:566 EDT]00000026 SystemErr R位于com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:458)
[3/21/12 12:08:47:566 EDT]00000026 SystemErr R位于com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewInformation(HttpInboundLink.java:387)
[3/21/12 12:08:47:566 EDT]00000026 SystemErr R位于com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:102)
[3/21/12 12:08:47:566 EDT]00000026 SystemErr R位于com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165)
[3/21/12 12:08:47:566 EDT]00000026 SystemErr R位于com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
[3/21/12 12:08:47:566 EDT]00000026 SystemErr R位于com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
[3/21/12 12:08:47:566 EDT]00000026 SystemErr R位于com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:136)
[3/21/12 12:08:47:566 EDT]00000026 SystemErr R位于com.ibm.io.async.ResultHandler.complete(ResultHandler.java:195)
[3/21/12 12:08:47:566 EDT]00000026 SystemErr R位于com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:743)
[3/21/12 12:08:47:566 EDT]00000026 SystemErr R位于com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:873)
[3/21/12 12:08:47:566 EDT]00000026 SystemErr R位于com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1473)
如果属性“ds”的类型为DataSource而不是Xadasource,则同样可以。但我希望获得XAConnections,因此需要XADataSource。我已经尝试了很多次搜索,但无法找出如何避免此强制转换异常。
有没有关于我应该采取哪些不同做法的建议?

为什么要自己管理XADataSource/XAConnection?相反,开始一个UserTransaction,获得一个普通的数据源,获得一个普通的连接,完成您的工作,然后提交UserTransaction。UserTransaction将导致XA被隐藏使用。

您将无法将其转换为XADataSource

XADataSource和常规DataSource都可以作为WSJdbcDataSource使用

WSJdbcDataSource实现WSDataSource,WSDataSource反过来扩展了DataSource

如果承载此数据源的底层JDBC驱动程序已启用XA,则您拥有的连接仍处于启用XA状态


很抱歉,我无法为您提供获取XADataSource的方法,因为这可能不可用。

我正在尝试自己下载TM,而不是使用其他API,如Atomikos。因此需要XADataSource。使用DataSource的UserTransaction工作正常,但我不想实现tht。在这种情况下,我怀疑是否有可靠地使用容器管理的数据源的方法,因为RRA将假定它完全控制事务交互。您最好使用DriverManager或直接与DB2类交互。@Andy:您实际上想实现什么(WebSphere的事务管理器还没有提供这一功能)?@Andreas:我想将Atomikos用作TM,让它的类处理资源的登记/交付。Atomikos数据源需要一个Xadasource类型的对象,我无法从jndi查找中获取该对象。这是现在的代码:
Context ctx=new InitialContext();ds=新的AtomikosDataSourceBean();setXaDataSource((XADataSource)ctx.lookup(“jdbc/dataSource1”)
但它引发了以下异常:
java.lang.ClassCastException:com.ibm.ws.rsadapter.jdbc.WSJdbcDataSource与javax.sql.XADataSource不兼容