我在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存在一些类似的问题。
也许你们其中一个人有一些建议?
答案 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:我昨天添加了与评论相同的信息,但不知怎的,它总是被隐藏,你需要点击显示评论才能看到。