# Datenbank optimal zu nutzen



## jeegeek (16. Okt 2014)

Hallo,

nachdem ich mich nun in Servlets eingearbeitet habe möchte ich jetzt das erste kleinere Projekt umsetzen wo eine Datenbank genutzt wird um Daten auszulesen. Wie ich mit Datenbanken arbeite ist klar, nur bin ich mir noch nicht sicher wie ich am besten mit einem Servlet eine Datenbank nutze. Ich habe nun schon Google befragt und viele Lösungen gefunden aber  keine Aussage was nun die beste Lösung ist. Ich habe nun folgende Ansätze:

1. In der doGet() bzw. doPost() Methode wird bei jedem Aufruf eine Verbindung zur Datenbank erstellt und die Informationen abgerufen/eingetragen.

2. Ich erstelle in der init() Methode des Servlets die Datenbankverbindung welche dann von allen Threads genutzt werden kann um auf die Datenbank zugreifen zu können.

Die erste Methode macht durchaus Sinn, meiner Meinung nach wäre es aber Unsinn unnötige Datenbankverbindungen aufzubauen da sie unnötig sind, zu einer stärkeren Belastung führen und auch noch mehr Zeit brauchen. Bei der zweiten Methode würde es für das Servlet eine Verbindung geben so lange es genutzt wird und alle Threads würden diese nutzen können. Vermutlich wäre das die beste Möglichkeit bei vielen Anfragen. Nur bin ich mir nicht sicher ob sich das Problemlos so wie ich mir das denke umsetzen lässt.

Ich würde es so machen (Auszüge)

```
import java.sql.*;
...

// Objekt für Datenbankzugriff
private Connection conn = null;
...

public void init(ServletConfig servletconfig)
    // Verbindung zur Datenbank herstellen
    conn = DriverManager.getConnection("jdbc:mysql://server/DBName?user=user&password=geheim");

...
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    Statement stmt = null;
    ResultSet rs = null;    
    stmt = conn.createStatement();
```

Lokal und theoretisch scheint es zu funktionieren weiß nur nicht ob da nicht ein Denkfehler drinnen sein könnte wenn mehrere Anwender Zeitgleich das ganze nutzen. Bin ich auf dem richtigen weg, oder habt ihr noch ein paar Ratschläge für mich?


----------



## stg (17. Okt 2014)

Die gängige Methode ist einen Connection Pool zur Verfügung zu stellen und daraus Verbindungen zu beziehen und wieder feizugeben. Physisch Verbindungen aufzubauen ist langsam, da hast du Recht, deswegen werden "eine Hand voll" aktiver Verbindungen im Pool bereitgestellt und diese dann nur _logisch_ geöffnet und geschlossen, das is wesentlich effizienter. Werden die vorhandenen Verbindungen knapp, so vergrößert man den Pool, und andersherum verkleinert man ihn wieder, wenn viele Verbindungen einfach nur so vor sich her dümpeln. Das ist aber in der Tat eine Standard-Aufgabe und wird mWn von allen gängigen aktuellen JDBC-Treibern schon von Haus aus unterstützt, so dass man sich gar nicht mehr um viel selbst kümmern muss.
Sofern du nicht nur einen einfachen Servlet-Container, sondern einen JEE-Application Server zur Verfügung hast, ist es noch viel einfacher. In der Regel lässt man dann nämlich sogar den Server den Connection Pool verwalten und speist die Verbindung zur Datenbank nur noch per Ressorce-Injection ein. Das ist dann vollkommen transparent und du musst dich in deiner Anwendung gar nicht mehr darum kümmern, wo die Verbindung herkommt und ebenso was im Endeffekt tatsächlich für eine Datenbank dahintersteht.


----------



## Thallius (17. Okt 2014)

Ein Singleton für die DB Connection ist mehr so programmieren der 80er. Heutige DB's sind schlau genug die Connections für Dich zu verwalten und schliessen diese nicht wirklich wenn du sie schleißt sondern halten sie in einem Cache.
Deshalb kannst du 100x hintereinander die DB öffnen und schliessen und hast trotzdem quasi keine Performance Einbusse. 

Deshalb würde ich Weg 1 wählen.

Gruß

Claus


----------



## jeegeek (17. Okt 2014)

Erst einmal danke euch beiden.

Ich lese hier heraus das es wie ich schon weiß viele Möglichkeiten gibt und keine wirklich schlecht oder gut ist. Alle Arbeiten mit den Datenbanken Tomcat zu übergeben hat meiner Meinung nach den Nachteil das man Probleme bekommt wenn Tomcat mal durch einen anderen Server ausgetauscht wird, daher macht es schon Sinn sich nicht so stark an Tomcat zu binden. Zu ConnectionPool habe cih bei Google mal gesucht und es scheint dort nicht mit 3-4 Zeilen Code erledigt zu sein, oder hat jemand einen Link zu einem kurzen Beispiel?

Es stellt sich nun die grundsätzliche Frage für mich ob sich so ein Aufwand lohnt. Sagen wir mal ich würde ein kleinen Blog Programmieren der beim Aufruf der Seite die letzten 5 Artikel die geschrieben wurden aus der Datenbank ließt und anzeigt. Bei sagen wir mal 10-50 Besucher in der Stunde bezweifle ich das sich der Aufwand für irgendwelche Datenbanken Pools überhaupt lohnt. Da würde ja die Verwaltung der Pools mehr Zeit verbrauchen als ein einfacher Zugriff. Wenn ich jetzt eine Seite Programmieren würde wo mehrere tausend Zugriffe in der Minute stattfinden würde es vermutlich anders aussehen. Ich denke aber mal es sollte wirklich so sein wie @Thallius schrieb das die Datenbank Treiber so schlau sein sollten die Verbindungen vernünftig zu verwalten.

Noch einmal zu meiner Umgebung. Zuhause zum Programmieren nutze ich Tomcat in einer virtuellen Umgebung, für Internet habe ich bei https://www.ip-projects.de/ ein Java Webhosting. Also eine Tomcat Umgebung wo ich Zugang zur Manager Gui habe um dort meine Anwendungen zu verwalten. Limitierung dort sind 2 GB Ram, weitere Limitierungen soll es nicht geben. Wobei ich mich damit jetzt noch nicht so intensiv befasst habe und eher Lokal aktiv bin


----------



## Thallius (17. Okt 2014)

Aehm du hast das glaube ich immer noch nicht verstanden. 

Den Pool gibt es bereits. Der ist in der Datenbank selber implementiert. Du must Dich da um überhaupt nichts kümmern. Das läuft alles automatisch ab.

Gruß

Claus


----------



## jeegeek (17. Okt 2014)

Thallius hat gesagt.:


> Den Pool gibt es bereits. Der ist in der Datenbank selber implementiert. Du must Dich da um überhaupt nichts kümmern. Das läuft alles automatisch ab.



Bedeutet also ich kann in meinem Servlet so wie ich möchte die Datenbank nutzen und ob ich Methode 1 oder 2 nutze ist egal weil die Datenbank das selber regelt wie sie es braucht?


----------



## Thallius (17. Okt 2014)

Genau... Es sei denn es ist eine MySQL v1.0oder so 

Gruss

Claus


----------



## jeegeek (17. Okt 2014)

Ich bedanke mich bei dir für deine Geduld. Jetzt sollte alles klar sein.

btw wenn ich MySQL in Version 1 nutzen würde hätte ich vermutlich größere Probleme in meinem Programm als den Zugriff auf die Datenbank


----------



## jeegeek (30. Okt 2014)

Noch einmal eine Frage die sich mir gestellt hat. Macht die Verwendung von SQLite in einer kleinen Webanwendung Sinn? Nehmen wir mal an eine kleine Anwendung soll verschiedenen Clients hauptsächlich Daten liefern die gespeichert sind und Schreibzugriffe sind eher gering. Würde es da Sinn machen auf SQLite zu setzen? Hat da jemand von euch schon Erfahrungen gemacht? Der Vorteil wäre eben das bei einer kleinen Anwendung auf einem schwachen System so der Overhead für eine Datenbank entfällt.


----------

