# Datenspeicherung in hsqldb



## Alex_winf01 (18. Nov 2007)

Nun habe ich eine weitere Frage: Wie in anderen Threads bereits beschrieben, wird mein Projekt mehrbenutzerfähig. Das schafft hsqldb. Folgendes fiktives Beispiel:

Eine Kundenverwaltung, ein Kunde kann mehrere Bestellungen mit mehreren Artikeln. Mehrere Mitarbeiter greifen auf die Datenbank Kundenverwaltung zu. Ein Kunde A wird von einem Mitarbeiter AM bearbeitet. Ein Kunde B wird von einem Mitarbeiter BM bearbeitet. D. h. Mitarbeiter AM und Mitarbeiter BM greifen ggf. gleichzeitig auf die Datenbank Kundenverwalung und gleichzeitig auf die Tabellen Bestellungen und Artikel zu.

Nun habe ich gelesen, dass hsqldb die Daten in Textdateien abspeichert. Das gibt doch immer Probleme mit den Zugriffsrechte, oder bin ich da auf dem Holzweg?


----------



## HoaX (18. Nov 2007)

bist du, zumindest teilweise. da nur hsqldb auf die datei zugreift wird es sich kaum selbst ein bein stellen.

welche locking-methoden hsqldb anbietet steht in der doku. was die genau machen lässt sich googeln und ist hier nicht in einer antwort zu beschreiben.


----------



## stevieboy (19. Nov 2007)

Ich würde auch auf die Speichermethode von hsqldb achten.

Da es für schnelle Zugriffe optimiert ist, legt es sich standardmäßig als Memory-DB, d.h. vollständig im RAM laufend, an.

Am Anfang ist das ja noch ganz schön, aber nach jedem Neustart der DB muss diese zunächst die Grunddaten einlesen und arbeitet danach erst das GANZE LOG ab mit allen Aktionen seit der Erstellung. Ein Neustart kann demnach eine ganze Zeit dauern. Zudem liegen alle Kundendaten und Änderungen anhand des Logfiles im Klartext vor.

Mit etwas Konfiguration kann man diese Klippen aber sicherlich umschiffen.


----------



## HoaX (19. Nov 2007)

iirc gibts beim CREATE TABLE nen keyword dass die tabelle nicht im log sondern als binärdatei gespeichert wird.


----------



## Alex_winf01 (19. Nov 2007)

@ HoaX

Gibt es dann nicht Probleme mit den Zugriffsrechten, wenn die Tabellen in Binärdateien gespeichert werden? Es werden garantiert mehrere Benutzer gleichzeitig auf die Tabellen zugreifen.


----------



## HoaX (19. Nov 2007)

wieso sollte es? wo speichern denn andere rdbms ihre daten ...


----------



## Alex_winf01 (19. Nov 2007)

Danke für die Mühe und die Geduld.


----------



## Alex_winf01 (20. Nov 2007)

@ HoaX

Du meinst doch mit Binärdateien die Texttabellen? Da kann ich mir sehr gut vorstellen, dass es mit den Zugriffsrechten doch Probleme gibt.


----------



## HoaX (20. Nov 2007)

und wieso? es greift immer der selbe benutzer zu, nämlich der unter dessen account der db-server läuft ...


----------



## Alex_winf01 (20. Nov 2007)

Aber es sind doch ganz verschiedene Anwender, mit verschiedenen Usernamen und Passwörtern. :?:


----------



## HoaX (20. Nov 2007)

datenbankbenutzer != systembenutzer (einself)


----------



## Alex_winf01 (20. Nov 2007)

@ HoaX

ich habe mitlerweile in einem anderen Forum gelesen, wenn mehrere Anwender gleichzeitig in die Binärdatei schreiben, dass dann die Datei zerschossen wird. So wie ich es mir gedacht habe. Kannst Du mir kurz erläutern, wie Du das verhindern willst? Mittels RMI?


----------



## HoaX (20. Nov 2007)

link bitte? und lies bitte endlich das handbuch!

es gibt einen embedded-mode bei dem die anwendung direkt auf die datenbank zugreift und es gibt einen server-mode.

wenn du _einen_ server laufen hast und alle darüber die datenbank verwenden wirst du keine probleme bekommen, wieso auch? der server kümmert sich schon darum dass alles schön der reihe nach geht.

wenn du natürlich mit zwei oder mehr anwendungen/servern gleichzeitig auf die datenbank zugreifst ist natürlich schnell die db im arsch. aber das kann theoretisch nur passieren wenn die datei-locks umgangen werden, z.B. durch windowsfreigaben.

was meinst du wie andere datenbankserver wie mysql,postgresql,... es machen dass mehrere darauf zugreifen können? im endeffekt landen die daten immer irgendwo in einer datei.


----------



## Alex_winf01 (21. Nov 2007)

Ich bin jetzt die ganze Doku durchgegangen und habe nichts von locking-Methoden gefunden. In welchem Kapitel steht das denn? Ich habe sogar mit den Begriffen locking; hsqldb gegooglet. Ergebnis: Nichts brauchbares.

Und das hab ich im Netz auch noch gefunden: 





> http://www.oooforum.de/viewtopic.php?f=3&t=12968



Ich denk mal aber, der Link bezieht sich speziell auf OpenOffice und ist nicht eins zu eins übertragbar.


----------



## Alex_winf01 (21. Nov 2007)

@ All

ich hab jetzt den ganzen Tag gegoogelt und in die Doku geschaut und hab nix gefunden über die locking-Methoden. Kann mir keiner helfen?


----------



## ms (21. Nov 2007)

Ich habe gerade 2 Minuten gebraucht um das hier in der doku zu finden:
http://www.hsqldb.org/doc/guide/apc.html

ms


----------



## Alex_winf01 (26. Nov 2007)

@ ms

Danke für den Link. Hab den Anhang nicht unbedingt als locking-Methoden angesehen. Ich habe dabei folgendes Verständnisproblem:

Unter der Überschrift 





> Database Files


 werden die verschiedenen Dateien beschrieben. Unter der Überschrift 





> States


 werden die verschiedenen Zustände der Dateien beschrieben. Unter der Überschrift 





> Procedures


 werden die Prozeduren beschrieben.

Aber wie kann ich verhindern, wenn Anwender A den Datensatz B gerade bearbeitet und Anwender C möchte den Datensatz D bearbeiten, dass hsqldb die ganze Datei sperrt? Das ist nach meiner Meinung hieraus nicht ersichtlich. Es soll ja nur der Datensatz B für den Anwender C gesperrt werden und nicht die ganze Datei.


----------



## ms (26. Nov 2007)

Alex_winf01 hat gesagt.:
			
		

> Aber wie kann ich verhindern, wenn Anwender A den Datensatz B gerade bearbeitet und Anwender C möchte den Datensatz D bearbeiten, dass hsqldb die ganze Datei sperrt? Das ist nach meiner Meinung hieraus nicht ersichtlich. Es soll ja nur der Datensatz B für den Anwender C gesperrt werden und nicht die ganze Datei.


Dafür sorgt zum einen die Datenbank selbst.
Zum anderen sollte vom Betriebssystem her nur ein Benutzer exklusive Rechte für die Datenbankdateien haben.
Siehe hier: http://www.hsqldb.org/doc/guide/ch03.html#instance_setup-section

Zum Verständnis nochmal. Wenn ein Benutzer auf die Datenbank zugreift, dann über den Server (per SQL) und niemals auf die Dateien direkt.

ms


----------



## Alex_winf01 (26. Nov 2007)

Nur so zum Verständnis:

Ich starte den Server, schreibe meine normalen SQL-Dateien zum Einfügen, bearbeiten, löschen. Definiere, welcher Anwender was darf und gut ist? Alles andere muss der DB-Server und das Betriebssystem klären?


----------



## ms (26. Nov 2007)

Ist das wirklich so zweifelhaft und unglaublich was ein RDBMS leistet?



			
				Alex_winf01 hat gesagt.:
			
		

> Ich starte den Server, schreibe meine normalen SQL-Dateien zum Einfügen, bearbeiten, löschen. Definiere, welcher Anwender was darf und gut ist? Alles andere muss der DB-Server und das Betriebssystem klären?


Was verstehst du unter "...normale SQL-Dateien zum Einfügen, bearbeiten, löschen?"
Die Datenbank wird i.d.R. einmal mit SQL-Statements gefüttert wo Benutzer, Tabellen, usw... angelegt und Berechtigungen gesetzt werden und später im laufenden Betrieb die Applikation (Javaprogramm) durch Benutzereingaben wieder SQL-Statements ausführt die Datensätze einfügt, löscht, aktualisiert und zurückgibt.

ms


----------



## Alex_winf01 (26. Nov 2007)

@ ms

so hatte ich das auch gemeint. Einmal anlegen und dann immer wieder mit SQL-Statements füttern. Dann haben wir vom selben gesprochen.


----------



## Alex_winf01 (27. Nov 2007)

@ ms

vielleicht bin ich auch nur etwas "begriffsstuzig". Während des Studiums hab ich mit MySQL gearbeitet. Da hab ich eine Login-Klasse gehabt, die die Verbindung zur DB aufbaut. Dann hab ich eine Klasse Einfuegen gehabt. In dieser Klasse Einfuegen habe ich eine Methode definiert, die so aussah:


```
public static void artikel_einfuegen()
	{
			int anzahl;
			
			// Spalten, die eingefügt werden sollen
			String insert = "Insert into artikel (Artikel_Nr, Name, Beschreibung, Preis, aktionspreis, gewicht, link, lagerbestand) values (";
			
			//Daten in String
			String artikel_nr_String = Artikel.artikel_nr.getText();
			String name_String = Artikel.name.getText();
			String beschreibung_String = Artikel.beschreibung.getText();			
			String gewicht_String = Artikel.gewicht.getText();
			String preis_String = Artikel.preis.getText();
			String aktionspreis_String = Artikel.aktionspreis.getText();
			String link_String = Artikel.link.getText();
			String lagerbestand_String = Artikel.lagerbestand.getText();			
			
			
		try
		{   
            //Statement erzeugen
			Statement st_artikel_einfuegen = Login.connection.createStatement();
			
			// Insert-Anweisung zusammenstellen
			insert = insert + "'" +	artikel_nr_String.trim() + "'" + ",";
			insert = insert + "'" + name_String.trim() + "'" + ",";
			insert = insert + "'" + beschreibung_String.trim() + "'" + ",";
			insert = insert +       preis_String.trim() + ",";
			insert = insert +       aktionspreis_String.trim() + ",";
			insert = insert  +      gewicht_String.trim() + ",";    
			insert = insert +"'" +  link_String.trim()+"'" + ",";
			insert = insert +       lagerbestand_String + ")";
			
			// Insert ausführen
			anzahl = st_artikel_einfuegen.executeUpdate(insert);
			
			if (anzahl==1)
			{
				JOptionPane.showMessageDialog(null, " 1 Insert ok",
					"DB-Meldung", JOptionPane.INFORMATION_MESSAGE);
			}
			else
			{
				JOptionPane.showMessageDialog(null, " Es ist ein Fehler beim Einfügen in die Tabelle Artikel aufgetreten",
				"DB-Fehler", JOptionPane.ERROR_MESSAGE);
			}
			
			// Statement schließen
			st_artikel_einfuegen.close();
		}
		catch(SQLException e)
		{
			JOptionPane.showMessageDialog(null, " Es ist ein Fehler beim Einfügen in die Tabelle Artikel aufgetreten",
			"DB-Fehler", JOptionPane.ERROR_MESSAGE);
		}
	}
```

mit der Zeile 
	
	
	
	





```
// Statement schließen
			st_artikel_einfuegen.close();
```

regel ich den Zugriff auf den einzelnen Datensatz. So ähnlich muss ich das in hsqldb auch machen, oder?


----------



## ms (27. Nov 2007)

Probiers aus, dann wissen wir es.
Grundsätzlich sollte es in etwa so funktionieren.

ms


----------

