# Tomcat und DB Anbindung



## AlexD1979 (12. Oktober 2005)

Hallo,
Ich bin mit Tomcat noch völlig unbeholfen. Wie kann ich mit Tomcat (5.5) Verbindungen zu Datenbanken herstellen? Das Beispiel aus der Jarkata Anleitung will nicht, ich weiß nicht so recht, was ich in server.xml eintragen muss etc.... kann mir jmd von euch ein gutes Tutorial nennen wie man exemplarisch eine DB Connection mit Tomcat einrichtet ? Oracle oder MSSQL Server

Gruß und Danke 
Alex


----------



## schnuffie (12. Oktober 2005)

...ist zwar vom 5.0x, sollte aber ähnlich einstellbar sein.


----------



## Thomas Darimont (12. Oktober 2005)

Hallo!

 Die Möglichkeit zum Anlegen einer Datenquelle ueber die Tomcat-Admin Applikation (für Tomcat 5.5.9 muss man diese zuerst herunterladen (http://apache.mirrorplus.org/jakarta/tomcat-5/v5.5.9/bin/jakarta-tomcat-5.5.9-admin.zip) und ins %TOMCAT_HOME% Verzeichnis entspacken. Will bzw. muss man jedoch alles von Hand machen so sind einige kleine Schritte notwendig:
  Deshalb hier mal eine kleine Anleitung zur Definition einer Oracle (9.x) Datenquelle im Tomcat.

  1) Globale Datenquelle in der Server.xml anlegen (unter %TOMCAT_HOME%/conf)

```
<Server>
  ...
    <GlobalNamingResources>
  ...
  	   <Resource
  	  name="jdbc/oracleDS"
  	  type="javax.sql.DataSource"
  	  password="123456"
  	  driverClassName="oracle.jdbc.OracleDriver"
  	  maxIdle="2"
  	  maxWait="5000"
  	  validationQuery="select sysdate from dual"
  	  username="system"
  	  url="jdbc:oracle:thin:@localhost:1521:DEMO"
  	  maxActive="4"/>
  ...
    </GlobalNamingResources>
  ....
  </Server>
```
  (Oracle Instanz heist hier DEMO)

  Anschließend kopieren wir das jar mit dem Oracle JDBC Treiber nach %TOMCAT_HME%/common/lib.
  Das entsprechende Jar findet sich in der Regel im Verzeichnis %ORACLE_INST%/jdbc/lib
  -> ojdbc14.jar (Die Version ojdbc14_g.jar enthält eine Art Debug-Version, ...)

  2) Einfach Web-projekt erstellen:
  Beispielsweise mit dem Namen: de.tutorials.tomcat.examples
  Entsprechende Ordernstruktur aufbauen:

```
de.tutorials.tomcat.examples/
  de.tutorials.tomcat.examples/....
  de.tutorials.tomcat.examples/WEB-INF
  de.tutorials.tomcat.examples/WEB-INF/classes
  de.tutorials.tomcat.examples/WEB-INF/lib
  de.tutorials.tomcat.examples/WEB-INF....
```
 
  3) Unter %TOMCAT_HOME%/conf/Catalina/localhost/ einen der Web-App entsprechen Context-Descritor erstellen:
  Hier mit dem Namen: de.tutorials.tomcat.examples.xml, mit folgendem Inhalt:

```
<?xml version="1.0" encoding="UTF-8"?>
  <Context
  	docBase="E:/eclipse/3.1/eclipse/workspace_tomcat559/de.tutorials.tomcat.examples"
  	reloadable="true"
  	workDir="E:\eclipse\3.1\eclipse\workspace_tomcat559\de.tutorials.tomcat.examples\work">
  
  <ResourceLink
  	global="jdbc/oracleDS"
  	name="jdbc/oracle10"
  	type="javax.sql.DataSource"/>
  </Context>
```
 Ueber den ResourceLink teilen wir Tomcat mit, dass er innerhalb unsers Kontextes die Global definierte Datenquelle namens jdbc/oracleDS innerhalb des Kontextes unter dem Namen jdbc/oracle10 bereitstellen soll.

  Wenn der Tomcat nun die neuen Informationen verarbeitet hat (Context reload)
  Können wir über einen JNDI-Lookup an die DataSource gelangen:
  4) Beispielservlet schreiben.

```
package de.tutorials.servlet;
  
  import java.io.IOException;
  import java.sql.Connection;
  import java.sql.ResultSet;
  import java.sql.Statement;
  
  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;
  
  /**
   * Servlet Class
   */
  public class OracleDSExampleServlet extends HttpServlet {
  
  	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
  			throws ServletException, IOException {
  
  		try {
  			InitialContext ctx = new InitialContext();
  			Context ctxEnv = (Context) ctx.lookup("java:comp/env");
 			DataSource dataSource = (DataSource) ctxEnv.lookup("jdbc/oracle10");
  			Connection connection = dataSource.getConnection();
  
  			Statement statement = connection.createStatement();
  
 			ResultSet resultSet = statement.executeQuery("select sysdate from dual");
  
  			if(resultSet.next()) {
 				System.out.println(resultSet.getString(1));
  			}
  
  			resultSet.close();
  			statement.close();
  			connection.close();
  
  		} catch (Exception e) {
  			e.printStackTrace();
  		}
  	}
  }
```
  5) Die web.xml im WEB-INF Verzeichnis unserer Web-App:

```
<?xml version="1.0" encoding="UTF-8"?>
  <web-app version="2.4"
  	xmlns="http://java.sun.com/xml/ns/j2ee"
  	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  	<servlet>
  		<servlet-name>OracleDSExampleServlet</servlet-name>
 		<servlet-class>de.tutorials.servlet.OracleDSExampleServlet</servlet-class>
  	</servlet>
  	<servlet-mapping>
  		<servlet-name>OracleDSExampleServlet</servlet-name>
  		<url-pattern>/oracleDSExampleServlet</url-pattern>
  	</servlet-mapping>
  </web-app>
```
  6) Aufgerufen wird das ganze dann (beispielsweise) im Browser ueber:
http://localhost:8080/de.tutorials.tomcat.examples/oracleDSExampleServlet
  In der Tomcat Console erscheint dann die Ausgabe der aktuellen Uhrzeit/Datum...

  Gruß Tom


----------



## AlexD1979 (19. Oktober 2005)

Hi Tom,
Ich habe alles verstanden und so ausgeführt wie du das angegeben hast. Die Datei habe ich OracleDSExampleServlet.jsp genannt. Nur wenn ich diese Datei aufrufe im Browser bekomme ich den Quelltext angezeigt. 
package de.tutorials.servlet; import java.io.IOException; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; 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; /** * Servlet Class */ public class OracleDSExampleServlet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { try { InitialContext ctx = new InitialContext(); Context ctxEnv = (Context) ctx.lookup("java:comp/env"); DataSource dataSource = (DataSource) ctxEnv.lookup("jdbc/oracle10"); Connection connection = dataSource.getConnection(); Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("select sysdate from dual"); if(resultSet.next()) { System.out.println(resultSet.getString(1)); } resultSet.close(); statement.close(); connection.close(); } catch (Exception e) { e.printStackTrace(); } } }

Was ist falsch ?


----------

