# Suche für meine Anwendung optimale Datenbank !



## jagdfalke (18. Jul 2005)

Hi, 
ich suche eine lokale Datenbank, dh. sie soll nicht auf irgendeinem Server laufen oder irgendwie was anderes benötigen als das, was java bietet. Auch hohe Performance ist hintergründig, da es sich sowieso nur um eine einzige Tabelle handelt. 
Das Programm soll, falls die Datenbank noch nicht vorhanden ist, eine erstellen können, so dass ich nur dass Programm transportieren muss und alles lauffertig ist.
Ich dachte an sowas die MSAccess, hab aber keine Ahnung ob das mit Java geht und ob das auch unter Linux läuft. Also wenn jemand ne Idee hat, bitte raus damit !!!
mfg
jagdfalke


----------



## bambi (18. Jul 2005)

Mhh... kann mir wirklich net vorstellen, dass MSAccess unter Linux laeuft...

Ansonsten suchtst Du ja sicher was kleines, schnelles und guenstiges, right? Ich denke mal, dass MySQL da immer 'ne
ganz nette Loesung ist - bin da aber auch kein Profi bei den "kleineren" DBs.


----------



## EagleEye (18. Jul 2005)

Access läuft glaube auch unter Linux ich würde das aber auch nich als gute Datenbank bezeichnen nimm lieber MySQL PostSQL (oder wie das heiß) oder besorg dir Oracle
Du kannst mit Java jede Datenbank benutzten


----------



## Dukel (18. Jul 2005)

Ich würde eine Javadatenbank wie Hsqldb oder Derby empfehlen. Die kann man komplett in das Programm einbauen und der nwender muss nichts mit installieren.


----------



## robertpic71 (18. Jul 2005)

Also Access ist da wahrscheinlich die "schlechteste" Wahl. Es fängt schon damit an, dass man keine freien JDBC-Treiber bekommt und mit der ODBC-Bridge arbeiten muss.

Mit Linux als Server für MS Access ist es auch Essig. Möglich das man das Ding mit Wine (Windowsumgebung für Linux) zum Laufen bringt, aber das sind keine guten Voraussetzungen für ein neues Programm und deren Distribution. 

Welche Datenbank zu deinem Projekt passt, hängt auch von den Datenmenge und Anzahl der (gleichzeitigen) Benutzer ab. 

Für eine Standaloneanwendung sind die bereits genannten Javadatenbanken wahrscheinlich eine gute Lösung. (ich habe damit allerdings noch nicht gearbeitet)

Wenn es etwas größer wird, also mit Datenbankserver, tendiere ich zur freien Datenbank PostreSQL (auch unter Windows und Linux). MySQL liegt zwar auch in dieser Leitungsklasse, aber wenn man "große" Datenbanken gewohnt ist, nervt der teilweise abweichende SQL-Syntax von MySQL etwas (wird aber mit jeder Version besser).

Während die freien Datenbanken bei kleinen Datenmengen (bis 100-200 MB) noch ganz gut mit den großen mithalten, vergrössert sich der Abstand zunehmend mit der Datenmenge/Anzahl der User. 

Also wenns im Gigabytebereich noch performant bleiben soll, muss Oracle oder IBM's DB2 her. 

LG Rob


----------



## jagdfalke (18. Jul 2005)

Hi, also es geht wirklich nur darum, dass einige Daten vom Benutzer in einer leeren Tabelle gespeichert werden müssen. Die Datenbank ist also beim ersten Starten des Programms nicht vorhanden, wird dann aber sobald die ersten Daten gespeichert werden müssen angelegt. Datenbankserver sind da glaub ich ein bisschen zu viel des guten. Ist ja wie mit Kanonen auf Spatzen schießen.
Ich probier dann glaub ich mal dieses Hsqldb. Gibts dazu gute Tutorials?
Danke für die antworten.
mfg
jagdfalke


----------



## robertpic71 (18. Jul 2005)

Das kommt davon, wenn man zwischen dem Lesen und den Antworten ein paar Stunden vergehen läßt. Deine Anforderungen waren eigentlich ausreichend im 1. Posting erklärt...   Da habe ich bei den Möglichkeiten eindeutig zu weit nach oben "skaliert" (ist halt mein Fachgebiet)...

Hier eine kurzer Bericht zu HSQLDB

www.javamagazin.de/itr/online_artikel/psecom,id,312,nodeid,11.html

LG Rob

Edit: für kleine Datenmengen bietet sich natürlich auch das XML-Format an.


----------



## Dukel (19. Jul 2005)

jagdfalke hat gesagt.:
			
		

> Hi, also es geht wirklich nur darum, dass einige Daten vom Benutzer in einer leeren Tabelle gespeichert werden müssen. Die Datenbank ist also beim ersten Starten des Programms nicht vorhanden, wird dann aber sobald die ersten Daten gespeichert werden müssen angelegt. Datenbankserver sind da glaub ich ein bisschen zu viel des guten. Ist ja wie mit Kanonen auf Spatzen schießen.
> Ich probier dann glaub ich mal dieses Hsqldb. Gibts dazu gute Tutorials?
> Danke für die antworten.
> mfg
> jagdfalke



Ich hab das einmal gemacht zum testen. Hab 2 Threads erstellt. Eins für die DB und eins für das Programm:


```
import java.io.*;
import org.hsqldb.*;
public class SDb {
	Server database = new Server();
	public void start() {
		database.setDatabaseName(0,"sprit");
		database.setDatabasePath(0,"." + File.separator + "database");
		database.setSilent(false);
		database.setNoSystemExit(true);
		database.start();
	}
}
```


----------



## jagdfalke (19. Jul 2005)

Danke!! Ein bischen Quellcode ist zum Einstieg immer gern gesehen !!
mfg
jagdfalke


----------



## jagdfalke (23. Jul 2005)

Hi,
 kennt jemand ein gutes Einsteigertutorial für HSQLDB ? Bei mir fängts schon mit der Installation von HSQLDB (Suse Linux) an.

mfg
jagdfalke


----------



## Roar (23. Jul 2005)

http://hsqldb.org/web/hsqlFAQ.html
http://hsqldb.org/web/hsqlDocsFrame.html


----------



## Dukel (24. Jul 2005)

jagdfalke hat gesagt.:
			
		

> Hi,
> kennt jemand ein gutes Einsteigertutorial für HSQLDB ? Bei mir fängts schon mit der Installation von HSQLDB (Suse Linux) an.
> 
> mfg
> jagdfalke



Das musst du ja nicht installieren. Das Archiv runterladen, entpacken und die .jar zu deinem Java Programm dazupacken und importieren.


----------



## jagdfalke (24. Jul 2005)

Ich hab mal den Beispiel-Code von http://hsqldb.org/web/hsqlDocsFrame.html ausprobiert. Aber da kommt immer "ClassNotFoundException: org.hsqldb.jdbcDriver" als Fehlermeldung. Hängt das mit dem Importieren zusammen? Der Code importiert aber nur java.sql.* das ist schon alles.



```
import java.sql.*;


public class DatenbankTest {

    Connection conn;   
    
    public DatenbankTest(String db_file_name_prefix) throws Exception {
        // Load the HSQL Database Engine JDBC driver
        // hsqldb.jar should be in the class path or made part of the current jar
        Class.forName("org.hsqldb.jdbcDriver");

        // connect to the database.   This will load the db files and start the
        // database if it is not alread running.
        // db_file_name_prefix is used to open or create files that hold the state
        // of the db.
        // It can contain directory names relative to the
        // current working directory
        conn = DriverManager.getConnection("jdbc:hsqldb:"
                                           + db_file_name_prefix,    // filenames
                                           "sa",                     // username
                                           "");                      // password
    }

    public void shutdown() throws SQLException {
      
        Statement st = conn.createStatement();
        st.execute("SHUTDOWN");
        conn.close();
    }

    //use for SQL command SELECT
    public synchronized void query(String expression) throws SQLException {

        Statement st = null;
        ResultSet rs = null;

        st = conn.createStatement();         // statement objects can be reused with

        // repeated calls to execute but we
        // choose to make a new one each time
        rs = st.executeQuery(expression);    // run the query

        // do something with the result set.
        dump(rs);
        st.close();    // NOTE!! if you close a statement the associated ResultSet is

        // closed too
        // so you should copy the contents to some other object.
        // the result set is invalidated also  if you recycle an Statement
        // and try to execute some other query before the result set has been
        // completely examined.
    }
    //use for SQL commands CREATE, DROP, INSERT and UPDATE
    public synchronized void update(String expression) throws SQLException {

        Statement st = null;

        st = conn.createStatement();    // statements

        int i = st.executeUpdate(expression);    // run the query

        if (i == -1) {
            System.out.println("db error : " + expression);
        }

        st.close();
    }    // void update()

    public static void dump(ResultSet rs) throws SQLException {

        // the order of the rows in a cursor
        // are implementation dependent unless you use the SQL ORDER statement
        ResultSetMetaData meta   = rs.getMetaData();
        int               colmax = meta.getColumnCount();
        int               i;
        Object            o = null;

        // the result set is a cursor into the data.  You can only
        // point to one row at a time
        // assume we are pointing to BEFORE the first row
        // rs.next() points to next row and returns true
        // or false if there is no next row, which breaks the loop
        for (; rs.next(); ) {
            for (i = 0; i < colmax; ++i) {
                o = rs.getObject(i + 1);    // Is SQL the first column is indexed

                // with 1 not 0
                System.out.print(o.toString() + " ");
            }

            System.out.println(" ");
        }
    }                                       //void dump( ResultSet rs )

    public static void main(String[] args) {

        DatenbankTest db = null;

        try {
            db = new DatenbankTest("db_file");
        } catch (Exception ex1) {
            ex1.printStackTrace();    // could not start db

            return;                   // bye bye
        }

        try {

            //make an empty table
            //
            // by declaring the id column IDENTITY, the db will automatically
            // generate unique values for new rows- useful for row keys
            db.update(
                "CREATE TABLE sample_table ( id INTEGER IDENTITY, str_col VARCHAR(256), num_col INTEGER)");
        } catch (SQLException ex2) {

            //ignore
            //ex2.printStackTrace();  // second time we run program
            //  should throw execption since table
            // already there
            //
            // this will have no effect on the db
        }

        try {

            // add some rows - will create duplicates if run more then once
            // the id column is automatically generated
            db.update(
                "INSERT INTO sample_table(str_col,num_col) VALUES('Ford', 100)");
            db.update(
                "INSERT INTO sample_table(str_col,num_col) VALUES('Toyota', 200)");
            db.update(
                "INSERT INTO sample_table(str_col,num_col) VALUES('Honda', 300)");
            db.update(
                "INSERT INTO sample_table(str_col,num_col) VALUES('GM', 400)");

            // do a query
            db.query("SELECT * FROM sample_table WHERE num_col < 250");

            // at end of program
            db.shutdown();
        } catch (SQLException ex3) {
            ex3.printStackTrace();
        }
    }    // main()



}
```



mfg
jagdfalke


----------



## jagdfalke (24. Jul 2005)

Kann niemand helfen?
Dieser Code:

```
import java.sql.*;



public class Testdb {
  
  static Connection con;
  
  public static void main(String[] args) {
    try {
      open();
      close();
    } catch (Exception ex) {}
  }
  
  public static void open() throws Exception {
    Class.forName("org.hsqldb.jdbcDriver");
    con = DriverManager.getConnection("jdbc:hsqldb:hsqldbtest",
                                      "SA",
                                      "");
  }
  
  public static void close() throws SQLException {
    con.close();
  }
  
}
```

erzeugt diese Fehlermeldung im JBuilder:


> "hsqlServlet.java": Package /home/mathias/jbproject/Testdb/src/hsqldb/src/hsqlServlet.java aus Quelltext unnamed package stimmt nicht mit Verzeichnis /home/mathias/jbproject/Testdb/src/hsqldb/src/hsqlServlet.java überein.
> ....


[edit by stevg]Hab das mal gekürzt, das hat nen Fehler in der Anzeige erzeugt. Außerdem war das 50 mal die gleiche Meldung nur jeweils für eine andere Klasse, also unnötig alle 50 zu posten. Und die Meldung hat auch nichts mit deinem Code zu tun, sondern wie du hsqldb eingebunden hast.[/edit]


----------



## jagdfalke (24. Jul 2005)

Ok, und kannst du mir auch erklären wie's richtig funktioniert das einbinden?


----------



## stev.glasow (25. Jul 2005)

Einfach die hsqldb.jar in den Classpath aufnehmen - keine Ahnung wie das im JBuilder geht.
Sieht mir aber danach aus als hättest du irgendwas mit den Quellquote von hsqldb gemachst, brauchst du aber nicht, einfach jar einbinden (und server starten nicht vergessen). Schau auch mal ins Manuell dort steht auch noch einiges.


----------



## jagdfalke (25. Jul 2005)

Ok, habs gefunden wo das geht.
Für alle dies nicht wissen: Tools->Konfigurieren->JDKs
Dummerweise kommt jetzt als Fehlermeldung:
[/home/mathias/[/home/mathias/jbproject/Testdb/hsqldb.jar]/hsqldb.jar.java kann nicht gelesen werden

Der Pfad unter JDKs Konfigurieren istt aber  /home/mathias/Borland/JBuilder2005/jdk1.4/lib/hsqldb.jar
und auch nicht hsqldb.jar.java oder so.

Weiß jemand Rat?
mfg
jagdfalke


----------



## jagdfalke (26. Jul 2005)

Hat das noch niemand erlebt?


----------



## robertpic71 (26. Jul 2005)

Also ich habe dein Listing vom 24. 07. 2005, 11:56 (das erste, vollständige) bei mir einkopiert und das hat auf Anhieb geklappt. 

Also entweder hast du noch an der Klasse noch was verdreht, oder die hsqldb.jar falsch eingebunden. 

Ich kenne zwar den JBuilder nicht aber viele IDE's die ich mir angesehen habe, machen das über die *Projekteigenschaften --> Bibliotheken* oder z.B. abhängige JAR's und nicht über die JDK

Außerdem scheint mir deine Eingabe als Verzeichnis interpretiert zu werden. Die Angabe eines JDK ist auch immer ein Verzeichnis.

LG Rob


----------



## jagdfalke (26. Jul 2005)

Ich habe mir geholfen indem ich den JBuilder neu installiert habe und das .jar nochmal eingebunden habe. Jetzt verbindet er tadellos zur Datenbank.

Aber die Probleme gehen schon weiter:
Das Buch "Handbuch der Java-Programmierung" von Guido Krüger (welches mir hier empfohlen wurde) fängt die Einführung in Datenbanken mit einem Programm an, dass Verzeichnisse nach Unterverzeichnissen und Dateien durchsucht und die Struktur in ne Datenbank schreibt. Ist das nicht ein bisschen zu viel verlangt am Anfang? Naja, zum Problem:
Es gibt doch diesen DatabaseManager in HSQLDB (java -cp hsqldb.jar org.hsqldb.util.DatabaseManager) mit dem man eigentlich angelegte Tabellen und deren Struktur sehen sollte. So wie das Beispielprogramm Tabellen anlegt, sehe ich aber keine Ergebnisse im DatabaseManager.
Hier mal der Code:

```
try{ 
       stmt.executeUpdate("DROP TABLE dir");
    } catch(SQLException e) {
       System.out.println("Error while dropping table");
    }
   
     stmt.executeUpdate("CREATE TABLE dir (" +
                         "did       INT," +
                         "dname     CHAR(100)," +
                         "fatherdid INT, " +
                         "entries   INT)");

      stmt.executeUpdate("CREATE INDEX idir1 ON dir (did)");
      stmt.executeUpdate("CREATE INDEX idir2 ON dir (fatherdid)");
```

Wo gibts denn ne Beschreibung der ganzen Methoden? z.B würde mich mal interessieren, was der Unterschied zwischen stmt.executeUpdate(String) und stmt.executeQuery(String) ist usw...


mfg
jagdfalke

Achja:
Weiß nicht ob das für euch ok ist, dass ich dieses Problem in den selben Thread poste da es wahrscheinlich ein anderes Problem ist. Wenn nicht bitte ich einen der Admins oder wer auch immer dazu in der Lage ist das hier zu verschieben.
Thx


----------



## jagdfalke (27. Jul 2005)

Kommt schon Leute,
die Daten werden einfach nicht gespeichert. Warum?

mfg
jagdfalke


----------



## Bleiglanz (28. Jul 2005)

weil kein commit da ist


----------



## Ives (28. Jul 2005)

jagdfalke hat gesagt.:
			
		

> Wo gibts denn ne Beschreibung der ganzen Methoden? z.B würde mich mal interessieren, was der Unterschied zwischen stmt.executeUpdate(String) und stmt.executeQuery(String) ist usw...



http://java.sun.com/j2se/1.4.2/docs/api/java/sql/PreparedStatement.html bzw. im "Rest" der Java API ist das beschrieben.

PS: Eine DB mit nur einer Tabelle finde ich etwas merkwürdig,


----------



## jagdfalke (28. Jul 2005)

> PS: Eine DB mit nur einer Tabelle finde ich etwas merkwürdig



Sag mir ne andere Möglichkeit eine einzige Tabelle abzuspeichern !!



Was ist ein commit? Steht das in dem Link den Ives mir gegeben hat?


----------



## Ives (28. Jul 2005)

Du willst scheinbar relativ wenige Daten, die einfach strukturiert sind, speichern. Wie wärs mit einem File (welches Format auch immer). Datenbanken sind in der Regel für Größeres bestimmt  :wink: 

Wie wär´s damit: http://java.sun.com/j2se/1.4.2/docs/api/java/sql/Connection.html

PS: So schwer war das nicht zu finden.


----------



## jagdfalke (30. Jul 2005)

Hi, also nochmal zurück zu HSQLDB:
Ich hab mal das ganze mit MySQL versucht und es klappt wunderbar. Bei HSQLDB habe ich aber das Problem, dass da ja ein file entstehen müsst, indem alles gespeichert wird. also wenn ich als code

```
try { 
      Class.forName("org.hsqldb.jdbcDriver"); 
      System.out.println("DRIVER LOADED");
    } 
    catch (Exception ex) { System.out.println("Error loading Driver"); }

    try { 
      con = DriverManager.getConnection("jdbc:hsqldb:hsqldbtest","SA", "");
      stmt = con.createStatement();
      System.out.println("CONNECTED");
    }
    catch (SQLException ex) { System.out.println("Error getting connection"); }    
  }
```
da stehen habe müsste das file hsqldbtest heißen, richtig? Aber es ist nirgends. Es müsste doch im Projektverzeichnis sein oder? MySQL speichert das alles wunderbar ab und behälts auch aber HSQLDB nicht. Warum nicht? Wenn es wirklich was mit diesem commit zu tun hat, kann es mal jemand genauer erklären?

mfg
jagdfalke


----------



## jagdfalke (31. Jul 2005)

Das Problem scheint zu einfach für euch Pros zu sein. Hab Hilfe in nem anderen Forum bekommen:
stmt.executeQuery("SHUTDOWN"); vor dem con.close(); ausführen und fertig.

mfg
jagdfalke


----------

