2010-05-03 4 views
1

J'ai une webapp exécutée sur un serveur Websphere 6.1 que JNDI recherche pour une source de données. Cette webapp fonctionne très bien, le serveur Websphere reconnaît l'arbitre DataSource dans le web.xml etc ..Websphere 6.1, Source de données, deux applications

Maintenant, nous avons ajouté une deuxième webapp qui devrait utiliser cette source de données avec la même configuration, mais je reçois un ClassCastException lorsque je tente d'accéder à la la source de données.

Pour localiser le problème que j'ai mis cela dans mon code

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()); 
    } 

l'erreur déboiser est imprimé

[5/10/10 9:45:13:531 CEST] 00000176 SystemErr  R [email protected] 
[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 

Alors, je reçois un objet de la classe com.ibm.ws.rsadapter.jdbc.WSJdbcDataSource mais les causes de coulée DataSource le ClassCastException?

J'ai essayé cette application sur un autre serveur, était nouvelle installation 6.1, là ça marche. Il fonctionne également dans un environnement de Tomcat.

Une chose plus importante: Il est une source de données DB2 qui utilise le jt400.jar - il y a quelques problèmes avec simliar le pilote JDBC Oracle et WAS 6.

Peut-être que l'un d'entre vous a quelques suggestions?

+0

Vous devez inclure la trace de pile ou les gens devineront juste. –

+0

En plus de ce que bkail a mentionné, vous devez également fournir la topologie. Ces deux applications Web s'exécutent-elles sur le même serveur. S'agit-il d'un serveur unique ou d'une configuration ND, etc. La pile que vous avez fournie affiche des informations provenant de votre application - à java.lang.ClassCastException. (ClassCastException.java:29) à de.ac.action.ServiceAction.execute (ServiceAction.java: 65) Nous aurions besoin de savoir si le classcast est à la DataSource ou à un autre composant/classe. Cette pile ne fournit aucune information pour que les gens puissent vous aider. – Manglu

+0

Excusez-moi mais: Bien sûr, il y a une DataSource attendue sinon ma question n'aurait aucun sens. Un serveur est défini et deux applications doivent exécuter et partager cette source de données sur ce serveur. Comme mentionné dans ma question: Application on recherche la source de données avec succès, l'application deux me jette juste cette exception. Les liaisons de ressources JDBC sont exactement les mêmes, ainsi que le nom de recherche JNDI. – onigunn

Répondre

0

Les sources de données peuvent être définies sur plusieurs étendues différentes qui affectent leur visibilité. Si vous l'avez défini au niveau du serveur qui exécute la première application, il ne sera visible pour rien en dehors de ce serveur. J'utilise la définition surchargée de WebSphere de «serveur» dans le sens où la plupart des magasins créent des serveurs séparés pour chaque application afin qu'ils s'exécutent dans leur propre JVM. Si vous souhaitez que deux applications aient une visibilité sur la même source de données, définissez-la à un niveau supérieur commun aux deux applications.

+0

La source de données a la portée pour le serveur1, qui est le seul serveur là. Dans ce serveur, deux applications sont déployées. – onigunn

0

Merci pour l'article mis à jour. Je peux voir que la recherche JNDI est réussie. Je vois aussi que le type retourné dans WSJdbcDataSource qui implémente WSDataSource (qui s'étend à son tour de javax.sql.DataSource) Donc je ne vois rien de mal ici.

Maintenant, pouvez-vous imprimer l'objet con après la ligne qui le lance. (serait la dernière ligne de votre bloc d'essai).

La pile que vous avez fournie s'affiche en tant que CCE @ à de.ac.action.MAction.execute (MAction.java:77). Est-ce la dernière ligne de votre bloc try?

Le dernier message de null (est que le e.getCause())

faire également un chèque de bon sens sur votre importation de DataSource pour vous assurer qu'il est en effet javax.sql.DataSource

PS: I ajouté la même information que le commentaire hier, mais de toute façon il est toujours caché et vous devez cliquer sur Afficher le commentaire pour voir cela.

Questions connexes