Warum JNDI Rückkehr eine DataSource mit einem NULL-uri statt einer lookup-Fehler?
Suchte ich mir eine ähnliche Frage, aber nur gefunden, ähnlich wie Godaddy JNDI-Problem---Cannot create JDBC-Treiber-Klasse " für connect URL 'null', auf die noch keine Antwort auf meine generische Frage.
Tomcat 7.0.8 .. der folgende code
Context initialContext = new InitialContext();
datasource = (DataSource) initialContext.lookup("java:comp/env/" + "blah");
Connection c = null;
c = datasource.getConnection();
wirft diesen Fehler.
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1452)
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371)
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
...
Caused by: java.lang.NullPointerException
at sun.jdbc.odbc.JdbcOdbcDriver.getProtocol(JdbcOdbcDriver.java:527)
at sun.jdbc.odbc.JdbcOdbcDriver.knownURL(JdbcOdbcDriver.java:496)
at sun.jdbc.odbc.JdbcOdbcDriver.acceptsURL(JdbcOdbcDriver.java:319)
at java.sql.DriverManager.getDriver(DriverManager.java:386)
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1437)
... 24 more
Ich bin nicht gefragt, warum es fehlgeschlagen ist oder wie es zu lösen ist.
Meine Frage ist, warum nicht die LOOKUP fehlschlägt?
Warum lookup erstellen eine nutzlose BasicDataSource mit einem null-URL? Gibt es einen besseren Weg, um zu erkennen, ob ein JNDI-name 'nicht existiert', als zu versuchen, es zu benutzen und sehen, wenn es auffliegt? Dieser Ansatz erinnert mich an wie Sie testen Brücken.
Ich schließlich bit die Kugel und zog eine Reihe von code aus raw-JDBC-code zu JNDI, und viele Geheimnisse bleiben noch offen.
Möchte ich vermeiden downcasting die BasicDataSource, wenn möglich, mindestens bewahren, eine illusion von Datenbank-Unabhängigkeit.
TIA
- Die Menschen können es nicht verkraften, verlorene Illusionen...
- was meinst du?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als ich verstehen, JNDI, es ist gedacht für die Aufbewahrung Verweise auf Objekte oder Objekt Fabriken.
Objekt business ist unkompliziert - configurer liefert eine Referenz auf das Objekt, app nutzt es, so einfach ist das. Aber für komplexere oder Generika Fällen ist es bequemer, um eine Referenz auf ein Objekt Fabrik gibt weit mehr Freiheit auf, wie die Objekte erstellt werden sollen.
Als Sie noch nicht gebucht, Ihre webapp ist
web.xml
noch der Tomcatconf/server.xml
ist, ist es schwer zu erarbeiten, aber ich würde vermuten, Sie haben etwas ähnliches in Ihrer web.xmlWenn Sie Lesen,Tomcat JNDI-howto, sollten Sie dies sehen:
Nun, schauen wir uns Tomcat ist die Umsetzung der oben. On line 112, können Sie sehen, dass, wenn gegeben
res-type
gleichjavax.sql.DataSource
es nutztorg.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory
um eine neue Datenquelle zu erstellen.Das ist es. An diesem Punkt der Arbeit von JNDI ist vorbei, es hat keinen Einfluss darauf, wie Objekte erstellt werden - und das zu Recht! Vergessen Sie nicht, dass die JNDI-gemeint ist die Speicherung von Referenzen auf jegliche Art von Objekten (E-mail-verbindungen, security realms, etc.). Es wäre unmöglich und unzumutbar ist, einen test schreiben, für jede andere Art von Objekt. Und auch so, einfach, indem Sie die Datenbank-Einstellungen, die es unmöglich wäre, festzustellen, ob diese ausreichen, um die Etablierung einer live-Verbindung zu die eigentliche Datenbank.
Das ist, warum Sie haben einen separaten Aufruf,
datasource.getConnection()
, und das ist, warum wirft erSQLException
was Sie sollen, zu erfassen und zu verarbeiten.p.s. man könnte vielleicht argumentieren, dass
BasicDataSourceFactory
sollte mehr smart und eine Liste der erforderlichen Eigenschaften/Argumente. Vielleicht. Doch das ist das Thema zu einer anderen Frage, als Sie ursprünglich gefragt haben nicht warum der LOOKUP fehl 😉Wenn Sie eine war-Datei auf dem tomcat web.xml und server.xml gemeinsam geben Sie die Definitionen, wie hier beschrieben. Manchmal, in Eclipse, verwenden Sie möglicherweise eine andere web.xml als Sie denken. Stellen Sie sicher, dass der debugger in Eclipse ist das laden der web-und server.xml Dateien, die Sie erwarten. Ich fand in meinem Fall, dass die web.xml nicht über die definition, also Hinzugefügt, die es gibt, und dies hat funktioniert.