JBoss4 --- EJB --- DataSources

Status
Nicht offen für weitere Antworten.

bronks

Top Contributor
Der JBoss treibt mich zur Verzweiflung.

Ich habe eine App, die auf dem OracleAS läuft und will das ganze jetzt auf dem JBoss laufen haben.

In einer EntityBean(BMP) steht u.a. folgendes:
Code:
javax.sql.DataSource ds = (javax.sql.DataSource) ctx.lookup("jdbc/EJBCoreDS");


In der EJBCore-DS.xml steht folgendes:
Code:
<datasources>
<local-tx-datasource>
  <jndi-name>jdbc/EJBCoreDS</jndi-name>
  <connection-url>jdbc:postgresql://localhost/ejb</connection-url>
  <driver-class>org.postgresql.Driver</driver-class>
  <user-name>user</user-name>
  <password>passwort</password>
</local-tx-datasource>
</datasources>


Die JBoss-JMX-Console sagt in diesem Zusammenhang:
Code:
jboss.jca
name=jdbc/EJBCoreDS,service=DataSourceBinding 
name=jdbc/EJBCoreDS,service=LocalTxCM 
name=jdbc/EJBCoreDS,service=ManagedConnectionFactory 
name=jdbc/EJBCoreDS,service=ManagedConnectionPool 

jboss.management.local
J2EEServer=Local,JCAResource=jdbc/EJBCoreDS,j2eeType=JCAConnectionFactory,name=jdbc/EJBCoreDS 
Wrapper,j2eeType=JCAResource,name=jdbc/EJBCoreDS 
J2EEServer=Local,j2eeType=JCAManagedConnectionFactory,name=jdbc/EJBCoreDS

Steht ja eigentlich alles drin, aber folgender Fehler wird mir vorgeworfen:
Could not locate datasource! Reason:
javax.naming.NameNotFoundException: jdbc not bound

Beim deployen selbst werden keine Fehler ausgegeben.

Ich hab keine Ahnung wo der Fehler liegt und ich hab schon alles mögliche durchsucht und gelesen. Kann mich bitte jemand aufklären bzw. mir einen Tipp geben was falsch ist oder wo ich noch nach dem Fehler suchen kann. Danke!
 

Bleiglanz

Gesperrter Benutzer
Ist ctx wirklich der reine initial Context? Poste mal mehr Code

so wie du das gemacht hast, darfst du natürlich nicht den ENC verwenden

mach lieber ein Mapping in der jboss.xml!
 

bronks

Top Contributor
@Bleiglanz:
Danke für Deine Antwort. Hab ein bissl nach ENC gesucht, aber leider nichts gefunden. Kannst Du mir dazu bitte ein paar zusätzliche Stich- und Suchworte geben.


Nach langem Suchen in der JBoss-Console hab ich des Rätsels Lösung gefunden:
JndiName = /jdbc/EJBCore
BindName = java:/jdbc/EJBCore


Wenn ich jetzt nach dem BindName im InitialContext suche, dann läuft das ganze. Meine ganzen Apps baue ich im JDeveloper. Im JDeveloper suche ich über den JndiName. Entweder ich bringe den JDeveloper irgendwie dazu, daß ich auch über diesen BindName zugreife oder der JBoss muß gezwungen werden den JndiName zu suchen. Hat jemand einen Vorschlag, wo ich etwas anpassen sollte und am besten noch einen kleinen Tip wie ich anpassen sollte?
 

Bleiglanz

Gesperrter Benutzer
AHHHHH

sorry, hab ich total vergessen; jetzt fällt mir wieder ein, dass ich das gleiche auch schon mal ewig lange gesucht habe (dieser blöde java: präfix!!)

Stichwort ENC

du kannst in der jboss.xml ein Mapping von echten jndi-namen in solche vornehmen, die NUR für eine Bean gelten (der sog. ENC der Bean, heisst sowas wie Environmental Context)

also etwa

"jdbc/EJBCORE" (global)

soll

"datenbanken/SuperCORE" (lokal nur innerhalb einer bestimmten EJB)

innerhalb deiner EJB liegen dann alle diese Dinge unter java:comp/env/, d.h. in dem Beispiel

lookup("java:comp/env/datenbanken/SuperCore");

Ziel dabei ist es, dass in deinem Quelltext keine globalen JNDI Namen mehr auftauchen, sondern symbolische "Links" zu den Ressourcen verwendet werden (die dann Serverspezifisch gemappt werden müssen)
 

bronks

Top Contributor
Das mit dem ENC ist schon raffiniert. Um das Präfix komme ich leider nicht herum.

Der "java:präfix" macht mir noch ein bissl Ärger. Auf Oracle läuft der Spaß ohne Präfix. Wenn ich einen Präfix davormache, dann funktioniert die App auf JBoss, aber dafür auf Oracle nicht mehr. Hat jemand eine Idee, wie man im JDeveloper erzwingen kann, daß der präfix akzeptiert wird?
 

bronks

Top Contributor
In tiefster Doku bin ich bereits versunken ... ... Oder mal ne ganz konkrete Frage:

Ist es möglich die Datenbankverbindung "java:/jdbc/EJBCore" so zu mappen, daß ich in der Bean nur mit
Code:
... ctx.lookup("EJBCoreDS");
suchen muß?
 

Bleiglanz

Gesperrter Benutzer
du könntest ja den jndi namen für Oracle einfach auf

java:/jdbc/EJBCoreDB

ändern (und dann überall den gleichen String zum lookup verwenden)

BTW: genau wegen dieser Problematik ist der ENC erfunden worden...
 

bronks

Top Contributor
Bleiglanz hat gesagt.:
du könntest ja den jndi namen für Oracle einfach auf

java:/jdbc/EJBCoreDB

ändern (und dann überall den gleichen String zum lookup verwenden)

BTW: genau wegen dieser Problematik ist der ENC erfunden worden...
Wenn ich das mit Oracle mache, dann werde ich gleich geschimpft, weil ich mich an die Java-Namensregeln nicht halte.

Jetzt mal zum ENC. In der jboss.xml hab ich folgendes reingeschrieben:
Code:
<resource-ref>
  <res-ref-name>EJBCoreDS</res-ref-name>
  <jndi-name>java:jdbc/EJBCoreDS</jndi-name>
</resource-ref>

Ich habe daraufhin erwartet, daß ich mit
Code:
... ctx.lookup("EJBCoreDS");
auf die DB zugreifen kann. Denkfehler? Total verkehrt? Macht man das ganz anders? Ich such schon seit 6 Stunden im Web herum ... Das Datasource-mapping für CMP findet man an jeder Ecke. Bitte sag mir was ich in die jboss.xml reinschreiben muß.
 

Bleiglanz

Gesperrter Benutzer
bronks hat gesagt.:
Bleiglanz hat gesagt.:
du könntest ja den jndi namen für Oracle einfach auf

java:/jdbc/EJBCoreDB

ändern (und dann überall den gleichen String zum lookup verwenden)

BTW: genau wegen dieser Problematik ist der ENC erfunden worden...
Wenn ich das mit Oracle mache, dann werde ich gleich geschimpft, weil ich mich an die Java-Namensregeln nicht halte.

Jetzt mal zum ENC. In der jboss.xml hab ich folgendes reingeschrieben:
Code:
<resource-ref>
  <res-ref-name>EJBCoreDS</res-ref-name>
  <jndi-name>java:jdbc/EJBCoreDS</jndi-name>
</resource-ref>

Ich habe daraufhin erwartet, daß ich mit
Code:
... ctx.lookup("EJBCoreDS");
auf die DB zugreifen kann. Denkfehler? Total verkehrt? Macht man das ganz anders? Ich such schon seit 6 Stunden im Web herum ... Das Datasource-mapping für CMP findet man an jeder Ecke. Bitte sag mir was ich in die jboss.xml reinschreiben muß.

der Enc beginnt immer mit java:comp/env/

das sind Namensregeln :)

versuch mal

lookup("java:comp/env/EJBCoreDS")
 

bronks

Top Contributor
Bleiglanz hat gesagt.:
versuch mal

lookup("java:comp/env/EJBCoreDS")
Ne leider auch nicht. Hab hier etwas geschriebenes dazu gefunden Links unter der überschrift Portable Data Source Lookup. Da wird mir versprochen, daß wenn ich die Zauberformeln in diverse XML-Dateien eintrage mit lookup("java:comp/env/EJBCoreDS") an meine Connection komme.

Was in die ejb-jar.xml kommt ist klar. Der <resource-ref-mapping> soll in eine OC4J-specific XML file rein. Hätte eigentlich die "orion-ejb-jar.xml" sein können, dachte ich. Wenn ich das dort eintrage, dann wundert sich der OC4J über diesen unbekannten deployment tag...
 

Bleiglanz

Gesperrter Benutzer
prinzipiell ist es immer das gleiche: für deine Bean in der ejb-jar.xml einen <ressource-ref> eintrag machen + in einem herstellerspezifischen Deskriptor diesen Namen zu einem echten JNDI namen mappen

-> ist immer ein elendes gefummel, du bist mit dem prob nicht allein
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben