Datenbank in Java

Aloisia

Mitglied
Danke für deine Idee mit den Warnungs/Informationsmeldungen. Das werde ich gleich mit aufnehmen. Ich werde das gleich probieren.
Entscheidend ob die DB existiert sind der .script und der .properties file, oder?
 

Aloisia

Mitglied
Also wenn ich eine DB mit HSQLDB erstelle, erhalte ich jweils eine .lck, eine .log, eine .properties und eine .script Datei. Außerdem wird ein .tmp Verzeichnis angelegt. Eine eigene DB Datei existiert nicht im Verzeichnis.

Bzw. wenn die Verbindung zur DB via "SHUTDOWN" schließe, sind nur noch die .properties und die .script da.
 
Zuletzt bearbeitet:

sheel

I love Asm
Ok...wieder was Neues für mich :)
Hatte mit HSQL noch nichts eigenes zu tun, aber mit ähnlichen programmbasierten DB-Systemen,
die ihre Daten in jweils eine Datei gepackt haben. HSQL macht scheinbar max. 4,
wobei .properties und .script beide immer vorhanden sein sollten.
Also eine der beiden Dateien kann geprüft werden, egal welche.
 

Aloisia

Mitglied
Nur um sicher zu gehen: Ich habe jeder "Zeile" in der Datenbank (also jedem Objekt) eine Nummer zugeordnet.
Die Daten sehen in etwa so aus
Code:
1|Aloisia|Ammerer|22|rot
...usw.

Will ich das jetzt Zeile 1 einlesen geht das über den SQL Befehl
SQL:
SELECT * FROM Persons WHERE NUMBER=1

oder?
 

Aloisia

Mitglied
Ja, das funktioniert wunderbar.
Allerdings scheint dieser Befehl folgendes zu tun:

Code:
Durchsuche die Tabelle Person und schau dabei auf die Spalte Number
Gehe in jede Zeile der Spalte
Wenn Number = 1 dann füge die Zeile zum Ergebnis hinzu
Suche weiter bis zum Ende der Tabelle

Ablauf der Funktion die die Daten beschafft:
Java:
public Person(int i) //i=number
Connection con=null;
        Person p=new Person();
        try {
            con = DriverManager.getConnection(
                    "jdbc:hsqldb:file:db/PSDB;shutdown=true", "sa",""
                    );

            Statement stmt = con.createStatement();
            ResultSet rs= stmt.executeQuery(buildloadString(i));
            if(rs.next()){
                int r = 0, c = 0;
                String cat, quest, an1, an2, an3, an4;

                cat = rs.getString(2).trim();
                quest = rs.getString(3).trim();
                an1 = rs.getString(4).trim();
                an2 = rs.getString(5).trim();
                an3 = rs.getString(6).trim();
                an4 = rs.getString(7).trim();
                r = Integer.parseInt(rs.getString(8));
                c = Integer.parseInt(rs.getString(9));
                q = new Person(i, cat, quest, an1, an2, an3, an4, r, c);
            }

            rs.close();
            stmt.close();
        } catch (SQLException e) {

            e.printStackTrace();
        }
        finally{
            if ( con != null )
                try {
                    con.close();
                } catch ( SQLException e ) {
                    e.printStackTrace();
                }
        }
        return p;
    }


So, mein Problem, ich hab also 300 Daten und es werden 300 Zeilen bei jedem Aufruf überprüft => O(n^2)
Gibt es eine Möglichkeit wie bei einem Array gezielt nur auf Zeile x zuzugreifen. (Als ich das gegoogelt habe habe ich meine Lösung gefunden)
 

sheel

I love Asm
Mir fehlt da beim Code bisschen was zum Verständnis. Was ist buildloadString(i),
und kannst du die vollständige Person-Klasse herzeigen (oder zumindest Variablen und Konstruktoren)?

Und was willst du gerade machen? Alle Zeilen aus der DB laden und in je ein Person-Objekt speichern?
 

Aloisia

Mitglied
Mir fehlt da beim Code bisschen was zum Verständnis. Was ist buildloadString(i),
und kannst du die vollständige Person-Klasse herzeigen (oder zumindest Variablen und Konstruktoren)?

Java:
private int number;
    private String category;
    private String quest;
    private String a1;
    private String a2;
    private String a3;
    private String a4;
    private int right;
    private int currentFolder;

  
    public Person() {
        this(0, "null", "null", "null", "null", "null", "null", 1,0);
    }

    public Question(int n, String c, String q, String a1, String a2, String a3,
            String a4, int r,int f) {
        this.number = n;
        this.setCat(c);
        this.quest = q;
        this.a1 = a1;
        this.a2 = a2;
        this.a3 = a3;
        this.a4 = a4;
        this.right = r;
        this.currentFolder=f;
    }
Die Funktion "baut" das sql String

Java:
private static String buildloadString(int i){
        String s="SELECT * FROM Person WHERE NUMBER="+i;
        return s;
    }

Person:
Und was willst du gerade machen? Alle Zeilen aus der DB laden und in je ein Person-Objekt speichern?

Jap. Allerdings manchmal nicht alle...
 

Improof

Erfahrenes Mitglied
Hi,

So, mein Problem, ich hab also 300 Daten und es werden 300 Zeilen bei jedem Aufruf überprüft => O(n^2)

Nur mal zum Verständnis:
Das ist einfach genau die Art und Weise, wie eine Datenbank arbeitet. Klar gibt es da schnellere Varianten als HSQL (z.B. MySQL, Oracle). Aber egal nach was du suchst, also auch wenn deine WHERE Klausel 3 oder 4 Bedingungen enthält: Die DB wird bei jedem SELECT immer alle Einträge überprüfen (muss sie ja auch). Deine Spalte "Number" ist zwar für dich ein eindeutiger Index (und sollte demnach in der DB auch ein PRIMARY KEY sein).

Um es ein bisschen anschaulicher zu machen:
Du hast eine DB mit 3 Einträgen
1 | Max | Mustermann
2 | Sandra | Schmidt
3 | Hans | Huber

Wir stellen nun fest, dass wir bei Nr. 2 den Nachnamen nur mit 'd' statt 'dt' schreibt. Klar man könnte ein UPDATE machen, aber wir entfernen (aus welchem Grund auch immer) die ganze Zeile und fügen sie neu ein. Folgendes wird in der DB zu finden sein:

1 | Max | Mustermann
3 | Hans | Huber
2 | Sandra | Schmid


Soll heißen: Der Index ist zwar eindeutig zu einer Zeile zugeordnet, aber er ist kein Index wie in einem Array, der die Position des Elements angibt. Demnach muss die DB immer alle Werte durchgehen.
Ein anderes Beispiel wäre, wenn du alle Personen willst, die "Schmidt" heißen: Da müsstest du ja auch alle Zeilen durchgehen.

Du kannst es deiner DB nur ein bisschen erleichtern, wenn du die Index-Spalte auch als PRIMARY KEY anlegst (wie vorhin schon erwähnt), wenn du dann in deiner WHERE Klausel nur nach diesem Wert prüfst, weiß deine DB ja, dass dieser nur einmal vorkommt und kann deinen Eintrag schneller finden bzw. sucht nicht noch weiter, wenn er den Eintrag schon gefunden hat.


Gruß
Daniel
 

Neue Beiträge