Websphere 6.1,Datasource,两个应用程序

时间:2010-05-03 14:04:52

标签: java websphere datasource

我在Websphere 6.1服务器上运行了一个webapp,JNDI正在查找数据源。这个webapp运行正常,Websphere服务器识别web.xml等中的数据源参考。

现在我们添加了第二个webapp,它应该使用具有相同配置的数据源 当我尝试访问数据源时,我收到ClassCastException

找到问题我把它放到我的代码中

try{
        InitialContext ctx = new InitialContext();  
        Object obj = ctx.lookup(N2WebConstants.datasourceJNDI);
        System.err.println(obj.toString());
        System.err.println(obj.getClass());
        con = ((DataSource) obj).getConnection();
    }catch (Exception e){
        System.err.println(e);
        System.err.println(e.getCause());
    }

在错误日志中打印

[5/10/10 9:45:13:531 CEST] 00000176 SystemErr     R com.ibm.ws.rsadapter.jdbc.WSJdbcDataSource@e9240c0
[5/10/10 9:45:13:532 CEST] 00000176 SystemErr     R class com.ibm.ws.rsadapter.jdbc.WSJdbcDataSource
[5/10/10 9:45:13:539 CEST] 00000176 SystemErr     R java.lang.ClassCastException
    at java.lang.Throwable.<init>(Throwable.java:181)
    at java.lang.Exception.<init>(Exception.java:29)
    at java.lang.RuntimeException.<init>(RuntimeException.java:32)
    at java.lang.ClassCastException.<init>(ClassCastException.java:29)
    at de.ac.action.MAction.execute(MAction.java:77)
    at de.ac.web.GetTheView.doService(GetTheView.java:88)
    at de.ac.web.GetTheView.doGet(GetTheView.java:60)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:743)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1096)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:570)
    at com.ibm.ws.wswebcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:478)
    at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:3444)
    at com.ibm.ws.webcontainer.webapp.WebGroup.handleRequest(WebGroup.java:267)
    at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:815)
    at com.ibm.ws.wswebcontainer.WebContainer.handleRequest(WebContainer.java:1466)
    at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:119)
    at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:458)
    at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewInformation(HttpInboundLink.java:387)
    at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.ready(HttpInboundLink.java:267)
    at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.sendToDiscriminators(NewConnectionInitialReadCallback.java:214)
    at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.complete(NewConnectionInitialReadCallback.java:113)
    at com.ibm.ws.tcp.channel.impl.WorkQueueManager.requestComplete(WorkQueueManager.java:556)
    at com.ibm.ws.tcp.channel.impl.WorkQueueManager.attemptIO(WorkQueueManager.java:583)
    at com.ibm.ws.tcp.channel.impl.WorkQueueManager.workerRun(WorkQueueManager.java:979)
    at com.ibm.ws.tcp.channel.impl.WorkQueueManager$Worker.run(WorkQueueManager.java:1064)
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1462)

[5/10/10 9:45:13:539 CEST] 00000176 SystemErr     R null

所以,我得到了一个类com.ibm.ws.rsadapter.jdbc.WSJdbcDataSource的对象,但是投射DataSource会导致ClassCastException

我在另一台服务器上试过这个应用程序,WAS 6.1全新安装,它可以运行。它也适用于tomcat环境。

更重要的一点是:它是一个使用jt400.jar的DB2数据源 - Oracle JDBC驱动程序和WAS 6存在一些类似的问题。

也许你们其中一个人有一些建议?

2 个答案:

答案 0 :(得分:0)

数据源可能会在几个不同的范围内定义,从而影响其可见性。如果您在运行第一个应用程序的服务器级别定义它,那么该服务器之外的任何内容都不会显示它。我正在使用WebSphere的'server'重载定义,因为大多数商店为每个应用程序创建单独的服务器,因此它们在自己的JVM中运行。如果您希望两个应用程序具有对同一数据源的可见性,请在两个应用程序通用的更高级别定义它。

答案 1 :(得分:0)

感谢您更新的帖子。我可以看到JNDI查找成功了。我还看到WSJdbcDataSource中返回的类型包含WSDataSource(后者又从javax.sql.DataSource扩展)所以我没有看到任何错误。

现在可以在投射它的行之后打印出con对象。 (将是你尝试块的最后一行)。

您提供的堆栈在de.ac.action.MAction.execute(MAction.java:77)显示为CCE @。这是try块的最后一行吗?

null的最后一条消息(就是e.getCause())

还要对导入的DataSource进行健全性检查以确保它确实是javax.sql.DataSource

PS:我昨天添加了与评论相同的信息,但不知怎的,它总是被隐藏,你需要点击显示评论才能看到。