Java Websphere 6.1,数据源,两个应用程序
我有一个运行在WebSphere6.1服务器上的webapp,JNDI会查找数据源。这个webapp运行良好,Websphere服务器识别web.xml等文件中的datasource ref 现在我们添加了第二个webapp,它应该使用相同配置的数据源,但是 当我尝试访问数据源时,我收到一个ClassCastException 为了找到问题所在,我已将其放入我的代码中Java Websphere 6.1,数据源,两个应用程序,java,websphere,datasource,Java,Websphere,Datasource,我有一个运行在WebSphere6.1服务器上的webapp,JNDI会查找数据源。这个webapp运行良好,Websphere服务器识别web.xml等文件中的datasource ref 现在我们添加了第二个webapp,它应该使用相同配置的数据源,但是 当我尝试访问数据源时,我收到一个ClassCastException 为了找到问题所在,我已将其放入我的代码中 try{ InitialContext ctx = new InitialContext();
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
我在另一台服务器上试用了这个应用程序,它是6.1新安装的,可以正常工作。它也可以在tomcat环境中工作
还有一件更重要的事情:它是一个使用jt400.jar的DB2数据源——Oracle JDBC驱动程序和WAS6也存在一些类似的问题
也许你们中有人有一些建议?数据源可能在几个不同的范围内定义,这会影响它们的可见性。如果您在运行第一个应用程序的服务器级别定义了它,那么该服务器之外的任何东西都不会看到它。我使用WebSphere对“服务器”的重载定义,即大多数商店为每个应用程序创建单独的服务器,以便它们在自己的JVM中运行。如果您希望两个应用程序对同一数据源具有可见性,请在两个应用程序通用的更高级别上对其进行定义。感谢更新的帖子。我可以看到JNDI查找是成功的。我还看到了WSJdbcDataSource中返回的类型,它实现了WSDataSource,WSDataSource又从javax.sql.DataSource扩展而来,所以我在这里没有看到任何错误 现在,您可以在投射con对象的行之后打印它了。将是您的try块的最后一行 您提供的堆栈在de.ac.action.MAction.executeAction.java:77处显示为CCE@。这是你试块的最后一行吗 null的最后一条消息是e.getCause 还要对数据源的导入进行健全性检查,以确保它确实是javax.sql.DataSource
PS:我昨天添加了与comment相同的信息,但不知何故它总是隐藏的,你需要单击show comment来查看。你需要包括堆栈跟踪,否则人们只会猜测。除了Bmail提到的内容,你还需要提供拓扑。这两个web应用在同一台服务器上运行。这是一台服务器还是一个ND设置等。您提供的堆栈显示了来自应用程序的信息-位于java.lang.ClassCastException.ClassCastException.java:29位于de.ac.action.ServiceAction.executeServiceAction.java:65我们需要知道classcast是否位于数据源或其他组件/类。这个堆栈不提供任何这样的信息给帮助你的人。对不起,但是:确保有一个预期的数据源,否则我的问题就没有任何意义了。定义了一台服务器,在此服务器上,两个应用程序应运行并共享这一数据源。正如我在问题中提到的:应用程序1成功地查找了数据源,应用程序2抛出了这个异常。JDBC资源绑定和JNDI lookupname完全相同。您提到过:当我调用JNDI查找时,NULL对象JNDI查找的结果应该是引用或NameNotFoundException。它不应该返回空值。我也不明白null如何导致ClassCastException。我能理解NPE,但不能理解ClassCastException。嗨,Manglu,我更新了我的帖子,也许你想看看这个。数据源的作用域是server1,它是那里唯一的服务器。在此服务器中部署了两个应用程序。