Websphere 6.1, источник данных, два приложения - PullRequest
1 голос
/ 03 мая 2010

У меня есть веб-приложение, работающее на сервере Websphere 6.1, который JNDI ищет в источнике данных. Это веб-приложение работает нормально, сервер Websphere распознает ссылку на источник данных в файле web.xml и т. Д.

Теперь мы добавили второе веб-приложение, которое должно использовать этот источник данных с той же конфигурацией, но Я получаю 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 только что установил, там все работает. Это также работает в окружении котов.

Еще одна важная вещь: это источник данных DB2, который использует jt400.jar - есть некоторые аналогичные проблемы с драйвером Oracle JDBC и WAS 6.

Может быть, у кого-нибудь из вас есть предложения?

Ответы [ 2 ]

0 голосов
/ 13 мая 2010

Спасибо за обновленный пост. Я вижу, что поиск JNDI успешен. Я также вижу, что тип, возвращаемый в WSJdbcDataSource, который подразумевает WSDataSource (который, в свою очередь, происходит от javax.sql.DataSource), поэтому я не вижу здесь ничего плохого.

Теперь вы можете распечатать объект con после строки, которая его отбрасывает. (будет последней строкой вашего блока try).

предоставленный вами стек отображается как CCE @ at de.ac.action.MAction.execute (MAction.java:77). Это последняя строка вашего блока try?

Последнее сообщение null (это e.getCause ())

Также выполните проверку работоспособности вашего импорта DataSource, чтобы убедиться, что это действительно javax.sql.DataSource

PS: вчера я добавил ту же информацию, что и комментарий, но почему-то она всегда скрыта, и вам нужно нажать на комментарий, чтобы увидеть это.

0 голосов
/ 03 мая 2010

Источники данных могут быть определены в нескольких различных областях, которые влияют на их видимость. Если вы определили его на уровне сервера, на котором запускается первое приложение, он не будет виден никому, кроме этого сервера. Я использую перегруженное определение WebSphere «сервер» в том смысле, что большинство магазинов создают отдельные серверы для каждого приложения, поэтому они работают в своей собственной JVM. Если вы хотите, чтобы два приложения имели видимость одного и того же источника данных, определите его на более высоком уровне, который является общим для обоих приложений.

...