Websphere 6.1, источник данных, два приложения

У меня есть веб-приложение, работающее на сервере 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, там оно работает. Он также работает в среде tomcat.

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

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


person onigunn    schedule 03.05.2010    source источник
comment
Вам нужно включить трассировку стека, иначе люди будут просто гадать.   -  person Brett Kail    schedule 03.05.2010
comment
В дополнение к тому, что упомянул bkail, вам также необходимо предоставить топологию. Эти два веб-приложения работают на одном сервере. Это отдельный сервер или настройка ND и т. д. Предоставленный вами стек показывает информацию из вашего приложения — в java.lang.ClassCastException.‹init›(ClassCastException.java:29) в de.ac.action.ServiceAction.execute (ServiceAction.java:65) Нам нужно знать, находится ли приведение класса в DataSource или каком-либо другом компоненте/классе. Этот стек не предоставляет такой информации людям, которые могли бы вам помочь.   -  person Manglu    schedule 04.05.2010
comment
Извините, но: конечно, ожидается источник данных, иначе мой вопрос не имел бы никакого смысла. Определен один сервер, и на этом сервере должны запускаться два приложения и совместно использовать этот источник данных. Как упоминалось в моем вопросе: первое приложение успешно ищет источник данных, второе приложение выдает мне только это исключение. Привязки ресурсов JDBC точно такие же, как и имя поиска JNDI.   -  person onigunn    schedule 04.05.2010
comment
Привет, я повторяю, что вам нужно предоставить дополнительную информацию. Вы упомянули об этом: Объект NULL, когда я вызываю поиск JNDI. Результат поиска JNDI должен быть ссылкой или NameNotFoundException. Он никогда не должен возвращать ноль. Также я не понимаю, как нуль может привести к исключению ClassCastException. Я могу понять NPE, но не ClassCastException.   -  person Manglu    schedule 05.05.2010
comment
Привет, Манглу, я обновил свой пост, может быть, ты захочешь это проверить.   -  person onigunn    schedule 10.05.2010
comment
Привет, спасибо за обновленный пост. Я вижу, что поиск JNDI прошел успешно. Я также вижу, что тип, возвращаемый в WSJdbcDataSource, который реализует WSDataSource (который, в свою очередь, расширяется от javax.sql.DataSource). Так что я не вижу здесь ничего плохого. Теперь вы можете распечатать мошеннический объект после строки, которая его бросает. (будет последней строкой вашего блока try). Предоставленный вами стек отображается как CCE @ в de.ac.action.MAction.execute(MAction.java:77). Это последняя строка вашего блока try? Также проверьте правильность импорта DataSource, чтобы убедиться, что это действительно javax.sql.DataSource.   -  person Manglu    schedule 12.05.2010


Ответы (2)


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

person Kelly S. French    schedule 03.05.2010
comment
Источник данных имеет область действия для server1, который является единственным сервером. На этом сервере развернуты два приложения. - person onigunn; 04.05.2010

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

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

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

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

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

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

person Manglu    schedule 13.05.2010