# 1 Programm, 2 Datenbanken



## Reggie (25. Sep 2009)

Moin Zusammen,

Ich bin relativ neu in der Java Programmierung und wollte nun fragen wie ich es am besten bewerkstellige das ich in einem Programm 2 JDBC Treiber verwenden kann. Also das ich irgendwo festlege welche ich benutzen will und dann die entsprechenden Treiber gewählt werden. Am besten zur Laufzeit.

Wäre dankbar für eine Hilfestellung.


----------



## DerEisteeTrinker (26. Sep 2009)

ich würde mir eine klasse bauen, der ich übergebe, welcher Treiber verwendet werden soll und welche parameter der JDBC-String hat. die kannst du ja dann mehrfach instanzieren mit unterschiedlichen angaben.


----------



## Reggie (26. Sep 2009)

Und dann auch das statement an die klasse weitergeben?


----------



## Gelöschtes Mitglied 5909 (26. Sep 2009)

```
Connection oracleConnection = DriverManager.getConnection("oracle...");
        Connection mySQLConnection = DriverManager.getConnection("mySQL...");
        
        PreparedStatement oracle = oracleConnection.prepareStatement("SELECT * FROM FOO");
        PreparedStatement mySQL = mySQLConnection.prepareStatement("SELECT * FROM FOO");
```

comprende?


----------



## DerEisteeTrinker (26. Sep 2009)

@raiL: mach mal ganz ruhig. sind nicht alles gleich experten.

Nein die Klasse organisiert dir nur die Verbindung. Durch das JDBC ist es JAVA völlig egal, was für eine Datenbank dahinter steht. Du kannst die Statements und alles von der Connection bekommen. So wie raiL das schon verdeutlicht hat


----------



## Reggie (26. Sep 2009)

das heisst ich könnte mir ne klasse basteln die so in der art

```
public Connection getconnection(String DBType){
Connection conn = null;

if(DBType == MySql){
Connection mySQLConnection = DriverManager.getConnection("mySQL...");
}else if(DBType == Oracle){
Connection oracleConnection = DriverManager.getConnection("oracle...");

}
return conn;
}
```

und das übrige wie gewohnt abhandeln?

Und noch eine Zwischenfrage... Wozu ist das Class.ForName("com.mysql.JDBC") odeer so ähnlich gut?

Und noch was... könnt ich dann die verbindung auch offen halten und Sie immer wieder mit getconnection holen?

Greets Reggie


----------



## DerEisteeTrinker (26. Sep 2009)

Also ich würde eine Enumeration verwenden, wenn du die richtige Version nimmst. Dann kannst du sicher sein, dass man nur aus den angegeben Verbindungen wählen kann. Ansonsten kannst du ab da wie gehabt arbeiten.

das Class.forName läd den richtigen Treiber in die JDBC, weil sonst weiß das System ja nicht, worum es geht


----------



## Reggie (26. Sep 2009)

Das mit der Enumeration hab ich noch nicht ganz verstanden... also anstatt String einem Int machen oder wie ist das gemeint mit nur aus den vorhandenen auswählen können?

Und ist es völlig egal ob ich nun die Statements aus Java importiere oder die mitgelieferten aus dem MySql JDBC?


----------



## DerEisteeTrinker (26. Sep 2009)

```
public enum DataBaseEnum {
	MySQL, ORACLE;
}
```


```
public class DBConnection {
	
	public DBConnection(DataBaseEnum database) {
		
		switch (database) {
		case MySQL:
			
			break;

		case ORACLE:
			
			break;
			
		default:
			break;
		}
		
	}
	
}
```

so ungefähr sieht es dann aus. dann kann ein programmierer nur aus den Elementen der Enum auswählen und kommt auf keine falschen gedanken


----------



## Reggie (26. Sep 2009)

Ah so 

Ich danke dir vielmals das hilft mir schonma sehr weiter

Ich habe noch 2 abschliessende fragen:

Kann ich so eine Connection während der gesamten Runtime ausrechterhalten und überall wo ich Daten vom SQL brauche mit getConnection holen? 
Im moment mache ich für jeden Prozess eine Connection auf und schliesse Sie dann wieder.

Und kann ich für alles die Resultset und statement Klassen benutzen die von Java mitgeliefert werden? oder muss ich die des JDBC Treibers importieren?


----------



## DerEisteeTrinker (26. Sep 2009)

wann du die Connection holst, hängt davon ab wann du sie brauchst. wenn dein Programm oft die Datenbank brauch, dann halte die Verbindung offen, aber in der Regel ist es besser, wenn du die Verbindung gleich wieder schließt, wenn sie nicht mehr direkt gebraucht wird. weil manche DBs ein Problem damit haben, wenn die Verbindung aus iwelchen Gründen abreißt.

die Klassen von Java sollten für die JDBC-Arbeit reichen. Nur wenn du merkst, dass die Klassen nicht das machen, was du brauchst, dann importiere andere


----------



## Reggie (26. Sep 2009)

angenommen sie tun nicht das was ich will... dann kann ich ja kaum 2 oder 3 arten von Statements importieren oder? oder müsst ich sie dann immer voll referenzieren? also anstatt

```
Statement st = Mysqlconnection.getstatement();
```
 müsst ich dann

```
com.MySQL.JDBC.Statement st = Mysqlconnection.getstatement();
```
Schreiben?


----------



## DerEisteeTrinker (26. Sep 2009)

wenn du die standard Statements in der Klasse nicht benutzt, kannst du auch oben nur die spezifischen Statements importieren und musst nicht jedes mal den langen paketpfad angeben. es kommt halt drauf an, was du oben importierst


----------



## Reggie (26. Sep 2009)

Ja klar aber ich hab in dem fall ja 2 spezifische.....


----------



## maki (26. Sep 2009)

Wie DerEisteeTrinker schon sagte, einfach nur die JDBC API nutzen. d.h. die Interfaces, nciht die konkreten Klassen.
Ansonsten sind Connection Pools nicht verkehrt, wie immer eigentlich.



> Am besten zur Laufzeit.


Wozu braucht man so etwas eigentlich?


Sobald du nicht mehr nur das SQL verwendest das von beiden gleichzeitig verwendest, ist dein Code nicht mehr Portabel. Da Oracle im Gegensatz zu MySQL Sequenzes verwendest, ist das hier der Fall.

Nachtrag: Der letzte Satz ist offenbar nicht zutreffend..


----------



## Reggie (26. Sep 2009)

Ok Danke euch allen, vor allem Eisteetrinker


----------

