# lokale Datenbank innerhalb einer Swing-Anwendung



## pinhead84 (18. Okt 2008)

Dies ist mein erstes Posting hier im Forum. Also erstmal vorab Hallo in die Runde!

Ihr scheint ja ein kompetenter 'Haufen' zu sein, was Java-Programmierung betrifft, also habe ich mich mal angemeldet, um eure Meinung zu meinem Problem einzuholen. 

Zum Background, damit ihr einschätzen könnt, worum es grob geht: Ich habe bereits eine Client-Server-Infrastruktur implementiert, welche ihre Dienste ganz anständig verrichtet. Nun bin ich zur Erkenntnis gekommen, dass innerhalb der Client-Anwendung (basierend auf Swing) eine lokale Datenbank vorliegen sollte, welche in regelmäßigen Intervallen mit der Server-Datenbank synchronisiert wird. Bei häufigen Read-Only-Operationen auf der Datenbank spart dies eine Menge unnötigen Traffic zwischen Client und Server, abgesehen von der geringeren Laufzeit.

So weit so gut. Ich bin nun noch am Rätseln, welche lokale Datenbank man einsetzen könnte. Ich habe mich ein wenig umgeschaut und folgende Kandidaten in Erwägung gezogen:

1. HSQLDB
2. H2 Database Engine
3. Apache Derby

Folgende Anforderungen wären von den Datenbanken zu erfüllen:

1. Muss mit Hibernate verwendbar sein (inkl. Transaktionen etc.).
2. Ausgelagerte Datenbankdateien müssen verschlüsselt gespeichert werden, dass der Anwender mit keinen externen DB-Tools mit diesen Dateien etwas anfangen kann.
3. Je schneller, desto besser. 

Ich habe mir die Dokus der 3 Kandidaten angeschaut und konnte nur mit Derby Anforderung 1 & 2 abdecken. HSQLDB und H2 scheinen keine Verschlüsselung der Auslagerungsdateien zu unterstützen, oder habe ich es nicht gefunden?

Nach den Benchmarks auf der Seite von H2, scheint Derby ja nicht das 'Geschwindigkeitsmonster' zu sein. Wie sind da eure Erfahrungen?

Wie verhält es sich mit der Performance der genannten Datenbanken bei größeren Datenmengen (>100.000)? 

Könnt ihr mir ggf. Alternativen empfehlen?



Vielen Dank im Vorraus


----------



## Gelöschtes Mitglied 5909 (18. Okt 2008)

ist dir AES nicht genug? 

http://www.h2database.com/html/features.html#file_encryption


----------



## AlArenal (18. Okt 2008)

pinhead84 hat gesagt.:
			
		

> Wie verhält es sich mit der Performance der genannten Datenbanken bei größeren Datenmengen (>100.000)?



Auf unpräzise Fragen kann man keine präzisen Antworten geben. Wenn DB Speed einzig von der Anzahl Datensätze abhinge, wäre es ja einfach... Du scheinst mit Datenbanken nicht viel Erfahrung zu haben. Immerhin kommen 100.000 Datensätze ziemlich schnell zusammen, sind also nun wirklich keine erwähnenswerte Marke.

Da du eh Hibernate verwenden willst, spricht nichts dagegen, dass du einfach austestest wie sich die Performance in Abhängigkeit von der RDBMS entwickelt.


----------



## pinhead84 (18. Okt 2008)

raiL hat gesagt.:
			
		

> ist dir AES nicht genug?
> 
> http://www.h2database.com/html/features.html#file_encryption


Vielen Dank für die Info. Da habe ich wohl nicht genau genug gelesen. 



			
				AlArenal hat gesagt.:
			
		

> pinhead84 hat gesagt.:
> 
> 
> 
> ...


Du scheinst die Kompetenz ja mit Löffeln gefressen zu haben. Überlege mal bitte ernsthaft, wie du hier auftrittst.

Dass die Anzahl der DB-Einträge allein nicht ausschlaggebend für die Gesamt-Performance ist, ist nun wirklich keine neue Erkenntnis. Ich finde es faszinierend, wie du aus wenigen Aussagen auf meine Erfahrungen schließen zu können meinst. Ich lasse mich grundsätzlich immer gern eines Besseren belehren, aber doch bitte auf sachliche Art und Weise. Wenn dir eine Information fehlt, frage doch einfach danach. Zumal die Frage nach der Performance nicht die Hauptintention meines Beitrages war.

Die Performance-Frage zielte darauf ab, dass HSQLDB (und warscheinlich auch H2) zum Programmstart komplett in den Speicher geladen werden. Wenn nun die Anzahl der Daten größer als der verfügbare Speicher ist, sollte es doch zu merklichen Performance-Einbrüchen kommen.



			
				AlArenal hat gesagt.:
			
		

> Da du eh Hibernate verwenden willst, spricht nichts dagegen, dass du einfach austestest wie sich die Performance in Abhängigkeit von der RDBMS entwickelt.


Das hatte ich auch vor. Nur bin ich bis dato davon ausgegangen,

(a) dass nur Derby verwendet werden könne und es also nichts zu testen gibt (da wurde ich eine Besseren belehrt)
(b) dass man hier im Forum bereits Erfahrungen in solchen Fragen hat und bereit ist Andere daran teilhaben zu lassen


----------



## Guest (19. Okt 2008)

Bei H2 wird nicht der ganze Datenbestand in den Speicher verfrachtet. Man kann sogar genau bestimmen, was gecached wird. Steht im Handbuch...


----------



## pinhead84 (19. Okt 2008)

Anonymous hat gesagt.:
			
		

> Bei H2 wird nicht der ganze Datenbestand in den Speicher verfrachtet. Man kann sogar genau bestimmen, was gecached wird. Steht im Handbuch...


Bisher hab ich nur die Möglichkeit gefunden, dies über die Database-URL zu regeln. Also entweder *jdbc:h2:file:/data/sample* oder *jdbc:h2:mem:<databaseName> *. Du meinst vermutlich etwas Anderes?

Ich werde jedenfalls mein Glück mal mit H2 versuchen. Danke für eure Kommentare.


----------



## Gelöschtes Mitglied 5909 (19. Okt 2008)

SET CACHE_SIZE

http://www.h2database.com/html/grammar.html?highlight=CACHE_SIZE&search=cache#setcachesize

eine Datenbank mit file mode die alles im speicher hält wäre auch irgendwie sinnlos, vor allem wenn dabei steht dass sie bis 256GB daten halten kann 

Und dass im memory mode alles gecached wird ist wohl auch offensichtlich


----------



## pinhead84 (19. Okt 2008)

raiL hat gesagt.:
			
		

> SET CACHE_SIZE


Danke, ich muss wohl mal meine Brille putzen. 



			
				raiL hat gesagt.:
			
		

> Und dass im memory mode alles gecached wird ist wohl auch offensichtlich


Der Memory-Mode kommt für meinen Anwendungsfall auch nicht in Frage. Die Datenbank sollte schon dauerhaft beim Client hinterlegt sein, sonst muss ja zu jedem Programmstart ein 'Rattenschwanz' an Daten abgeglichen werden.

Ich bin mal gespannt, wie die Gesamt-Performance durch die Dateiverschlüsselung beeinträchtigt wird.


----------

