# Frage zu Datenbank-Verbindung mit DataSource



## Billie (23. Oktober 2006)

Hellas!

Also ich hab mal eine Verständniss Frage. Seit kurzem beschäftige ich mich JDBC und hab bisher gelesen, dass es neben der klassischen Methode DriverManager.getConnection(...) auch noch die Möglichkeit gibt, über ein DataSource-Objekt eine Verbindung zur Datenbank (od. andere Datenquelle) herzustellen.

In der Schule sollte ich am Dienstag ein Beispiel zeigen, wie ich mich mit Java zu einer Datenbank verbinde. Lokal hab ich eine MySQL Datenbank installiert und das Beispiel selbst sollte eine einfache Konsolenanwendung sein.

Ich frage mich, wie schaffe ich es, die Verbindung zur Datenbank mit einem DataSource-Objekt herzustellen.

Nehmen wir folgende Zeilen aus dem JDBC-Tutorial von Sun:


```
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("jdbc/AcmeDB");
Connection con = ds.getConnection("genius", "abracadabra");
con.setAutoCommit(false);
```

Also, soweit ich verstanden habe, gibt es einen Service namens "AcmeDB". Dabei müsste man mir mal jemand sagen, was überhaupt ein Service in diesem Sinne sein soll. Egal, auf diesen Service kann ich mittels JNDI zugreifen.

Nur wie kann ich jetzt selbst so einen Service lokal auf meinen Computer anlegen. Ich weiss dass Apache-Tomcat das selbst macht und ich über die web.xml einen solchen Context anlegen kann, aber ich will ja eine eigene Klasse haben.

Im Internet bin ich auf folgendes Beispiel gestoßen:


```
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

public class JDBCConnect2Server {

	public static void main(String[] args) {
		Hashtable env = new Hashtable();
		env.put(
			Context.INITIAL_CONTEXT_FACTORY,
			"com.sun.jndi.fscontext.RefFSContextFactory");
		env.put(Context.PROVIDER_URL, "file:/tmp/registry");

		MysqlDataSource ds = new MysqlDataSource();
		ds.setDatabaseName("jdbctest");
		Context ctx = null;
		try {
			ctx = new InitialContext(env);
		} catch (NamingException ne) {
			ne.printStackTrace();
		}

		try {
			ctx.rebind("jdbc/mySrc", ds);
		} catch (NamingException ne) {
			ne.printStackTrace();
		}
	}
}
```
Quelle: http://www.jeckle.de/vorlesung/DB-Anwendungen/script.html#jdo

Aber dort Verstehe ich den Sinn dieser Zeilen einfach nicht:


```
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory");
env.put(Context.PROVIDER_URL, "file:/tmp/registry");
```

Wozu brauch ich das FileSystem-Context ... ich will ja die Datenbank ansprechen und keine Datei...

Hoffe ihr könnt mir ein wenig Licht ins dunkel bringen.

lg Billie


----------



## Thomas Darimont (23. Oktober 2006)

Hallo!

Scheinbar verwendet sun in diesem Beispiel eine FileSystem-basierte JNDI (Namens/Verzeichnisdienst)-Implementierung.

Hier mal ein Beispiel wie man eine bestimmte DataSource Implementierung Standalone verwenden kann.
http://www.tutorials.de/forum/java/...bank-existiert.html?highlight=MySQLDataSource

Gruß Tom


----------



## Billie (23. Oktober 2006)

Danke, das funktioniert!

Also brauch man diesen Context eigentlich gar nicht, ich war nämlich der Meinung, um überhaupt dieses DataSource Objekt zu bekommen, müsste ich auch etwas in der Richtung machen:


```
ds = (DataSource) ctx.lookup("jdbc/mySrc");
```

Also mit JNDI darauf zugreifen. Auf alle Fälle danke!


----------

