Java -> Tomcat -> Oracle

Rafael79

Grünschnabel
Hallo,

meine Anwendung soll eine JDBC-Verbindung des Typs 3 verwenden. Als Middleware haben wir uns für Tomcat6 entschieden. Dieser wurde auch anhand eines Tutorials aufgesetzt und konnte irgendwann auch die Verbindung zur ORACLE-Datenbank aufbauen.

Nun ist mir aber nicht klar, wie ich meine Applikation dazu bringe, die Verbindung nicht mehr direkt, sondern über den Tomcat aufzubauen. Irgendwie enden alle Beispiele die ich gefunden habe, mit dem erfolgreichen Aufbau der DB-Verbindung innerhalb des Tomcats.

Bisher habe ich nur herausgefunden das ich diesen Code-Schnipsel verwenden muss.

Code:
Context initContext = new InitialContext();
Context envContext  = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/myoracle");
Connection conn = ds.getConnection();
Dieser liefert mir jedoch den folgenden Fehler

Code:
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
    at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
    at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
    at javax.naming.InitialContext.getURLOrDefaultInitCtx(Unknown Source)
    at javax.naming.InitialContext.lookup(Unknown Source)

In anderen Beiträgen habe ich gelesen das man Properties definieren muss damit der Context initialisiert werden kann (siehe hier). Jedoch ist mir nicht klar geworden welches die richtigen Parameter sind. Auch "try and error" hat bisher nichts gebracht.

Zudem geht aus den ganzen Beispielen auch nicht hevor, wie meine Applikation weiss wo sie den Tomcat findet.

Kann mir jemand vielleicht hierzu weiterhelfen und mir erklären wie das genau funktionieren soll?

Vielen Dank im Voraus
Rafael
 
Hallo,

schau mal hier:
http://www.tutorials.de/enterprise-.../352849-jndi-datasource-mit-tomcat-6-0-a.html

ansonsten hier ein einfaches Beispiel mit mysql:

context.xml im WebContent/META-INF Verzeichnis parallel zu WEB-INF:
XML:
<?xml version="1.0" encoding="utf-8"?>
<Context path="/jdbc.web" reloadable="true">
    <Resource name="jdbc/testDB" auth="Container" type="javax.sql.DataSource"
     maxActive="100" maxIdle="30" maxWait="10000"
     username="username" password="password" driverClassName="com.mysql.jdbc.Driver"
     url="jdbc:mysql://localhost:3306/test"/>
</Context>

MySQL JDBC Treiber .jar nach WEB-INF/lib kopieren.

Servlet Definition und Beispiel für den JNDI Zugriff:

XML:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>jdbc.web</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <description></description>
    <display-name>TestServlet</display-name>
    <servlet-name>TestServlet</servlet-name>
    <servlet-class>de.tutorials.jdbc.web.TestServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>TestServlet</servlet-name>
    <url-pattern>/TestServlet</url-pattern>
  </servlet-mapping>
</web-app>

Java:
package de.tutorials.jdbc.web;

import java.io.IOException;
import java.sql.Connection;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

public class TestServlet extends HttpServlet {
  private static final long serialVersionUID = 1L;


  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,
    IOException {
    try {

      Context ctx = new InitialContext();
      Context envContext = (Context) ctx.lookup("java:/comp/env");
      DataSource ds = (DataSource) envContext.lookup("jdbc/testDB");
      Connection con = ds.getConnection();
      System.out.println(con);

      con.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

Siehe auch:
http://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html

In aktuellen Tomcat Versionen (6.0.29) geht mit Java 6 auch diese hübsche Variante :) EJB 3.x Resource Injection in Servlets:
Java:
package de.tutorials.jdbc.web;

import java.io.IOException;
import java.sql.Connection;

import javax.annotation.Resource;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

public class TestServlet extends HttpServlet {
  private static final long serialVersionUID = 1L;

  @Resource(name = "jdbc/testDB")
  private DataSource ds;


  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try {
      Connection con = ds.getConnection();
      System.out.println(con);
      con.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

Gruß Tom
 

Anhänge

  • jdbc.jndi.tomcat.web.zip
    5,5 KB · Aufrufe: 37
Zuletzt bearbeitet von einem Moderator:
Hallo Tom,

vielen Dank erstmal für die ausführliche Antwort.

Kannst du mir vielleicht noch bei den noch offenen Fragen weiterhelfen:

In anderen Beiträgen habe ich gelesen das man Properties definieren muss damit der Context initialisiert werden kann. Jedoch ist mir nicht klar geworden welches die richtigen Parameter sind. Auch "try and error" hat bisher nichts gebracht.

Zudem geht aus den ganzen Beispielen auch nicht hevor, wie meine Applikation weiss wo sie den Tomcat findet.

Die Applikation, der Tomcat, und die Datenbank liegen alle auf unterschiedlichen Servern/Clients. Ich komme einfach nicht dahinter wie die Kommunikation genau funktionieren soll.

Und noch eine kurze Frage:

Führt der Java-Code den du mir genannt hast, nicht zwangsläufig zu der selben Fehlermeldung wie ich sie beschrieben habe?

Gruss
Rafael
 
Hallo,

In anderen Beiträgen habe ich gelesen das man Properties definieren muss damit der Context initialisiert werden kann. Jedoch ist mir nicht klar geworden welches die richtigen Parameter sind. Auch "try and error" hat bisher nichts gebracht.

Zudem geht aus den ganzen Beispielen auch nicht hevor, wie meine Applikation weiss wo sie den Tomcat findet.

Die notwendigen Properties zur Erzeugung des InitialContext werden schon intern durch den Tomcat als System.properties gesetzt.

Siehe:
System.getProperties().list(System.out); in Servlet:

Ergibt u.a.:
java.naming.factory.initial=org.apache.naming.java.javaURLContextFactory, java.naming.factory.url.pkgs=org.apache.naming

Führt der Java-Code den du mir genannt hast, nicht zwangsläufig zu der selben Fehlermeldung wie ich sie beschrieben habe?
Nein -> siehe Antwort.

Gruß Tom
 
Ok. so weit habe ich das Verstanden. Vielen Dank schon mal dafür.

Aber was mache ich nun mit meiner Applikation, welche ja nicht direkt mit dem Tomcat verbunden ist?
Denn diese liegt ja auf dem Client. Und der Tomcat liegt ja auf einem Server im Netzwerk.

Irgendwie muss ich doch im Java-Code angeben das die Verbindung nun über den Tomcat laufen soll und nicht mehr direkt erstellt wird.

Die Beispiele geben ja immer nur an, wie ich eine Verbindung zur Datenbank aufbaue, indem ich ein entsprechende Class-Datei aufrufe, beispielsweise über JSP. Aber nicht wie ich die Connection auch von "aussen" abrufen kann.

Oder habe ich hier etwas übersehen?

Gruss
Rafael
 

Neue Beiträge

Zurück