如何从托管在 Websphere 6.1 上的 DB2 数据库获取 XADatasource

Posted

技术标签:

【中文标题】如何从托管在 Websphere 6.1 上的 DB2 数据库获取 XADatasource【英文标题】:How to get XADatasource from a DB2 database hosted on Websphere 6.1 【发布时间】:2012-03-21 16:14:24 【问题描述】:

我正在处理分布式事务。我正在尝试使用 Atomikos 作为事务管理器来实现 XA 事务。我的问题之一是能够从托管在 Websphere 6.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)

如果属性“ds”的类型为 DataSource 而不是 XADataSource,则同样可以正常工作。但我想获得 XAConnections,因此需要 XADataSource。我尝试了很多搜索,但无法弄清楚如何避免这种强制转换异常。 关于我应该做些什么不同的任何指示?

【问题讨论】:

【参考方案1】:

您将无法将其转换为 XADataSource。

XADataSource 和常规 DataSource 都可以作为 WSJdbcDataSource 提供给您。

WSJdbcDataSource 实现 WSDataSource 进而扩展 DataSource。

如果托管此数据源的底层 JDBC 驱动程序启用了 XA,那么您拥有的连接仍然启用了 XA。

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

【讨论】:

【参考方案2】:

为什么要自己管理 XADataSource/XAConnection?相反,开始一个 UserTransaction,获取一个正常的 DataSource,获取一个正常的 Connection,做你的工作,然后提交 UserTransaction。 UserTransaction 将导致 XA 在幕后使用。

【讨论】:

我正在尝试自己处理 TM,而不是使用像 Atomikos 这样的其他 API。因此需要 XADataSource。使用 DataSource 的 UserTransaction 工作正常,但我不想实现。 在这种情况下,我怀疑是否有办法可靠地使用容器管理的数据源,因为 RRA 将假定它完全控制事务交互。使用 DriverManager 或直接与 DB2 类交互可能会更好。 @Andy:您实际上想要实现什么(WebSphere 的事务管理器尚未提供帽子)? @Andreas:我想将 Atomikos 用作 TM,并让它的类处理资源的登记/除名。 Atomikos 数据源需要一个 XADataSource 类型的对象,我无法从 jndi 查找中获得该对象。这是现在的代码:Context ctx = new InitialContext(); ds = new AtomikosDataSourceBean(); ds.setXaDataSource((XADataSource) ctx.lookup("jdbc/dataSource1"));,但它会引发以下异常:java.lang.ClassCastException: com.ibm.ws.rsadapter.jdbc.WSJdbcDataSource incompatible with javax.sql.XADataSource 那么我坚持我上面的评论:我怀疑是否有办法可靠地使用容器管理的数据源。

以上是关于如何从托管在 Websphere 6.1 上的 DB2 数据库获取 XADatasource的主要内容,如果未能解决你的问题,请参考以下文章

无法从托管在 Websphere 应用程序服务器 v7.0 上的应用程序访问 HTTPS 服务

证书异常 Websphere 应用程序

Websphere 6.1 到 7.0 缺少 JmqiObject 和 JmsQueue

如何从运行在 WebSphere 应用程序服务器 v7 上的 Web 应用程序通过 JMS 连接到 Web 方法?

MyEclipse WebSphere开发教程:安装和更新WebSphere 6.1, JAX-WS, EJB 3.0

MyEclipse WebSphere开发教程:安装和更新WebSphere 6.1, JAX-WS, EJB 3.0