# Programm <> Datenbank wie effizient nutzen?



## javalui (5. Feb 2012)

Hallo Leute,

ich habe seit einiger Zeit an einem Programm zum verwalten von Artikeln und Aufträgen etc. gearbeitet. Vor kurzem habe ich das ganze dann nochmal neu gestartet weil ich zuvor alle Daten immer Serialisiert hatte.
Jetzt möchte ich das ganze mit einer Datenbank realisieren.
Mir stellt sich jetzt nur die Frage wie ich das ganze Treiberladen resultset erstellen connection aufbaugedöns in mein Programm so einbaue, dass ich den geringsten aufwand damit habe.

Konkretes Beispiel:
Artikelverwaltung.
Neuanlage eines Artikels
Daten eingeben
Speichern
DB-Satz erstellen.

Wenn ich mich an die Tutorials halte die ich bisher zu Datenbanken gelesen habe müsste ich jetzt jedes mal beim speichern:
Den Treiber laden
die verbindung aufbauen
einen Satz einfügen
und die Verbindungen usw. trennen.

Das ist doch ein mords aufwand und nicht gerade performant oder sehe ich das hier falsch?

Wie wird die Datenbank normalerweise in ein Programm eingebaut?

Konkreter:
Wann bau ich meine Verbindung zur Artikeltabelle auf?
Wann schließe ich die Verbindung?
Lässt sich das ganze so Kapseln, dass ich aus meiner Artikelverwaltung nur ein Classenobjekt erstellen muss das meine geöffnete Tabelle darstellt?

grüße
Javalui


----------



## tfa (5. Feb 2012)

> Wenn ich mich an die Tutorials halte die ich bisher zu Datenbanken gelesen habe müsste ich jetzt jedes mal beim speichern:
> Den Treiber laden
> die verbindung aufbauen
> einen Satz einfügen
> und die Verbindungen usw. trennen.



Der Treiber muss nur einmal beim DriverManager registriert werden.
Die Datenbankverbindungen holt man sich am besten über einen Connectionpool, der das Öffnen und Schließen der DB-Connections effektiv verwaltet. Von Apache gibt es einen ganz einfachen (DBCP).



> Lässt sich das ganze so Kapseln, dass ich aus meiner Artikelverwaltung nur ein Classenobjekt erstellen muss das meine geöffnete Tabelle darstellt?


Das sollte man sogar. Ein Persistenzframework bietet sich hier an. Hibernate ist z.B, eins der bekanntesten. Allerdings ist das sehr komplex, sodass es doch recht aufwendig  ist, den Umgang damit zu lernen. Es gibt auch einfachere Produkte. Sicherlich kann man es auch zu Fuß über JDBC und prepared Statements machen - wenn das Datenmodell nicht zu umfangreich ist.


----------



## javalui (6. Feb 2012)

Ist es Codetechnisch in Ordnung wenn ich beim öffnen meiner Artikelverwaltung die Verbindung zu meiner Artikelliste öffne und dann solange offen behalten, bis ich das Fenster wieder schließe? So, dass quasi immer meine Artikelliste da ist wenn ich änderungen oder Positionierungen vornehmen möchte?


----------



## turtle (6. Feb 2012)

Ich möchte das noch etwas mit mehr Hintergrundinformationen füllen zu dem was tfa schon richtig gesagt hat.

Deine Applikation sollte den Treiber nur einmal beim DriverManager registrieren. Dieser Schritt ist häufig überhaupt nicht mehr notwendig, weil die Treiber sich sebst registrieren, also kein Class.forName() mehr.

Der korrekte Umgang mit JDBC-Ressourcen ist nicht ganz ohne und deswegen wird sehr häufig mit Frameworks zugegriffen von denen man weiss, dass diese den Umgang richtig machen. Solche Frameworks sind myBATIS, JPA, Hibernate oder andere. Praktisch alle poolen die Verbindung zur Datenbank. 

Will sagen, das der Connectionpool Deiner Applikation eine bestimmte Anzahl von Verbindungen zur DB aufbaut und vorrätig hält. Deine Applikation fordert eine Verbindung zur DB an, die dann vom Pool bereits aufgebaut wurde und von Dir genutzt werden kann. Zum Abschluss Deiner DB-Aktion "schliesst" du die Verbindung. Dieser wird dadurch wieder als frei dem Pool zurückgegeben und steht weiteren Aktionen wieder zur Verfügung.

Daher solltest Du in Deiner Applikation Verbindungen aufbauen und schnell wieder schliessen. Das eine Verbindung über GUI-Grenzen offen gehalten wird  halte ich für grundfalsch!!! Macht ja auch kein Sinn weil beim nächsten Zugriff über den Pool wieder eine Verbindung angefordert wird.

Es kann beispielsweise passieren, dass für gewisse DB-Operationen Locks auf Tabellen/Zeilenm gehalten werden müssen. Dieses ist aber immens doof, wenn die Applikation nicht richtig weiter arbeiten kann, weil ein Benutzer noch einen DB-Lock hält und dann in die Mittagspause verschwunden ist. Dieses machen auch häufig die DB nicht gerne mit und beenden solche Transaktionen einfach nach einer gewissen Zeit.

Daher sollten DB-Operationen IMMER die Verbindung nach Abschluss wieder an den ConnetionPool zurückgeben.

Wenn Dein Programm endet, wird auch die physikalische Verbindung zur DB über den Pool abgebaut


----------

