# Welche Datenbank würd ich wollen? Teil 2



## Guest (17. Apr 2008)

So, zuerst mal danke an alle die mir letztens beratend zur Seite standen 

Meine Wahl ist gefallen: *tata* H2. Und zwar wegen dem embedded.

Das ganze ist für mein MultiPlayer-Rpg. Bisher hab ich meine ganzen Daten serverseitig mit JDom verwaltet, 
das wurd mir jetzt zu unübersichtlich (zu langsam konnt ich noch nicht feststellen), und da ja der Server 
auch in Java geschrieben ist dacht ich mir das passt.

Also H2 installiert, ein bisschen aufgepasst was dabei so passiert, dann das jar-file in mein Project einbunden.
Testcode aus dem quickstart eingebaut und tun gedrückt. 

Und es lief  direkt beim ersten mal. Klasse 

Aaaber... gleichzeitig mit der Weboberfläche und meinem Server drauf connecten geht nicht  Aus der Doku bin 
ich nicht schlau geworden, ich muss aber zugeben das mein Englisch so mies ist das ich nicht mal die Hälfte verstanden hab. 

Deshalb hier ein paar Fragen:

1. Wie wo wann warum wird die Datenbank gestartet? Ich kann direkt nach dem rechnerstart mit der Weboberfläche
drauf connecten, was mich wundert weil ich sie nie gestartet hab?? 

2. Wie kann ich mit mehreren Clients drauf connecten? Ich hab aus dem Handbuch nur entschlüsseln können das es gehen soll. Nur wie?

3. der embedded mode: wenn ich das wie in dem Quickstart angegeben über diesen einbundenen H2-Treiber connecte, 
reicht das dann schon? ist das dann embedded? Weil das connection aufbauen dauert fast 5 sekunden in meinem Programm.

4. Wie kann ich nen Primärindex autoincrement anlegen? laut Handbuch wär ich mir nichtmal sicher das es überhaupt
geht, das Wort autoincrement steht ganze einmal in dem Text, und da auch nur irgendwas von einer obscuren sql-
anweisung?

5. Wie kann ich eine Tabelle mit mehr als einem Schlüssel anlegen? In meinem Fall wären es 2 varchar und ein int.

Danke schonmal


----------



## HoaX (17. Apr 2008)

1) das solltest du wissen, von alleine startet sich keine datenbank
2) du brauchst dazu einen server -> warum ist dann "embedded" dein hauptauswahlkriterium?
3) würdest du den link direkt dazu schreiben würde ich sogar draufklicken, aber auswendig kennt hier sicherlich keienr die seite.
allgemein: wenn du hinter hinter jdbc:h2: einen dateipfad angibst ist es embedded, wenn du mit //rechnernameBzwIp/pfad weiter machst ist es nicht embedded sondern eben server
4) nie gebraucht, sequence?
5) welchen typ von schlüssel?


----------



## Guest (17. Apr 2008)

HoaX hat gesagt.:
			
		

> 1) das solltest du wissen, von alleine startet sich keine datenbank
> 2) du brauchst dazu einen server -> warum ist dann "embedded" dein hauptauswahlkriterium?
> 3) würdest du den link direkt dazu schreiben würde ich sogar draufklicken, aber auswendig kennt hier sicherlich keienr die seite.
> allgemein: wenn du hinter hinter jdbc:h2: einen dateipfad angibst ist es embedded, wenn du mit //rechnernameBzwIp/pfad weiter machst ist es nicht embedded sondern eben server
> ...



Zu 1: Da hast du recht, deswegen versteh ichs ja nicht. Ich müsst doch zumindest über die console zuerst die Datenbank starten, oder? Mach ich nicht, geht aber trotzdem, und das sagt mir das ich da was nicht verstanden hab.

Zu 2: Naja den server brauch ich nur zum Entwickeln, wenn ich gleichzeitig in der Datenbank gucken und trotzdem in
Eclipse den Debugger nutzen will  im produktivbetrieb würd ich das embedded nutzen, zum coden den server halt

Zu 3: 
Link


```
import java.sql.*;
public class Test {
  public static void main(String[] a)
  throws Exception {
    Class.forName("org.h2.Driver");
    Connection conn = DriverManager.
      getConnection("jdbc:h2:~/test", "sa", "");
    // add application code here
  }
}
```

zu 4: Was ist sequenz? Ich kenn das aus Oracle, das ist auch so ne fortlaufende Nummer, oder? Ist das nicht overhead? 

zu 5: Ich glaub ich versteh die Frage nicht. 
Ich bräucht sowas: create table test (id int primary key, name varchar (255) primary key, user varchar (255) primary key), aber da bekomm ich als Meldung :versuch zweiten primärschlüssel anzulegen. Soll halt ein zusammengesetzter Schlüssel sein.


----------



## Yzebär (17. Apr 2008)

5) Probier mal sowas:

CREATE TABLE Autor
(ISBN INT(11) NOT NULL,
VName VARCHAR(15) NOT NULL,
NName VARCHAR(15) NOT NULL,
PRIMARY KEY (ISBN, VName, NName)
);


----------



## robertpic71 (17. Apr 2008)

Zu 1)
So ist das mit der embbedded Datenbank - der erste Connect startet die Datenbankinstanz.

zu 2)

Ich drehe die Sache lieber um:

Beim Start deines programmes ladest du den Treiber und connectest im Filemodus.

Zusätzlich startest du dann einen TCP-Server (den Start von irgendeinem Testumgebungs-Flag abhängig machen)


```
import org.h2.tools.Server;
       ...
        Server server;
        ...
        String[] args = new String[]{"-tcpAllowOthers", "true"};
	try {
	    server = Server.createTcpServer(args);
	    server.start();    
	} catch (SQLException e) {
	    System.err.println("TCP-Server starten fehlgeschlagen");
	    e.printStackTrace();
	}
```

Vom Web-Client (oder jedem anderen SQL-Tool in Eclipse oder NetBeans) connectest du dann mit folgendem Connectionstring:

jdbc:h2:tcp:10.11.22.3/D:/DB/artikel4

Der Dateipfad muss mit dem aus dem Fileconnect übereinstimmen.

Optimalerweise macht man bei Programmende noch ein server.shutdown();


3.) Wenns länger dauert macht der eine Datenbank. Wenn man sicher ist, dass es die Datenbank schon gibt, sollte man die URL ergänzen:
String url = "jdbc:h2:/data/sample;IFEXISTS=TRUE";

4) H2 sollte so "frißt" relative viele SQL-Varianten, z.B.

```
CREATE TABLE users (
         id INT  AUTO_INCREMENT PRIMARY KEY,
         name VARCHAR(50),
         data2 VARCHAR(100)
       );
```

5.) Von 2 Primärschlüsseln rate ich mal ab (Performance, Foreign Keys.....). Abgesehen davon, soll der Name eindeutig sein? Wenn ja, dann geht das mit 2 Keys daneben: ID 1 Maier, ID 2 Maier, ID 3 Maier....

Mit:


```
create unique index username on users(name)
```

erhält man eindeutige Usernamen und einen performanten Zugriff wenn z.B. beim Login mit:

```
select * from users where name = ?
```
abfragt.

/Robert


----------



## Guest (18. Apr 2008)

@YzeBär Danke, eigentlich hab ich genau das gesucht, aber was robertpic71 schreibt bringt mich konzeptmässig
erstmal zum grübeln was besser ist in meinen Fällen.

@robertpic71 Dir auch erstmal danke , das ist schonmal unheimlich hilfreich gewesen. Da ich hier kein H2 hab
komm ich erst heut abend zum ausbrobieren, aber ich denke genau das hab ich gebraucht. Und super erklärt, grad
das die Datenbank mit der ersten Connection startet ist schon wichtig zu wissen. Ich hab mir da den Wolf
gesucht  :roll: 

Was mir jetzt noch nicht so ganz klar ist ist der H2\service-Ordner. Da sind ein paar bat-Dateien drin, mit denen ich
gestern nacht noch rumgespielt hab: 

1_install_service.bat : wohl um H2 als Dienst zu installieren?
5_uninstall_service.bat : entsprechend wär das dann klar
2_start_service.bat : äh... Dienst starten?
4_stop_service.bat : entsprechend synonym.

Für was sind die? Bei der Verwendung der Datenbank wie in diesem Tread bisher beschrieben wüsst ich grad nicht
warum ich die brauchen sollte. Zumal sie bei meinen Experimenten letzte Nacht nicht weitergeholfen haben.


----------



## robertpic71 (18. Apr 2008)

> Für was sind die? Bei der Verwendung der Datenbank wie in diesem Tread bisher beschrieben wüsst ich grad nicht
> warum ich die brauchen sollte. Zumal sie bei meinen Experimenten letzte Nacht nicht weitergeholfen haben.



Ich füge der Antwort 1) noch etwas hinzu, vielleicht wird das dann klarer:

So ist das mit der embedded Datenbank - der erste Connect startet die Datenbankinstanz. Der embedded Modus wird in der Connection-Url mit file: oder mem: (für Memorydatenbank) eingeleitet. Wenn du im H2-Wartungs-Webserver (auch ein Javaprogramm) eine embedded-Url (file:.., mem:..)  angibst, wird in dessen JVM die verwaltende Datenbankinstanz gestartet.

Das hilft nur wenig, wenn alle auf die selbe Datenbank zugreifen sollen. Bei der Memory-Datenbank hat dann jeder seine eigene Version und bei file: locked die erste Instanz, die anderen aus.

Deshalb:
Einer startet mit embedded und den TCP-Server, die anderen connecten mit tcp: als Client.

Der Service.bat Dateien dienen dazu H2 als Stand-Alone-Datenbank ala MySQL zu betreiben. 

In deinem Fall gibt es sowieso ein Serverprogramm, bei welchem sich der Betrieb Datenbank anbietet. Bei anders gestrickten Anwendungen (nur Clients) gibt es keine durchgehend laufende JVM. Hier startet man die Datenbank extra und alle Anwendungen greifen mittels tcp: als Client zu.

/Robert


----------



## Gast (18. Apr 2008)

Danke dir, robertpic71. Sehr gut erklärt, klar und einleuchtend. 

Keine Fragen mehr, Danke 

Hakt mich jemand ab?


----------

