SQL-Statement Datenbank nach SQL Statement schließen?

Tiri2

Neues Mitglied
Hey, meine Frage ist, ob man nach einem SQL Statement die Verbindung zur Datenbank schließen muss.
Wenn man jetzt wieder etwas von der Datenbank braucht, einfach wieder Verbinden oder nicht? Sollte ja keine Probleme geben.

Also allgemein gefasst, ist es wichtig eine Datenbank danach zu schließen?
Es ist btw egal welche Datenbank. Es geht allgemein darum.
 

Marinek

Bekanntes Mitglied
Hi,

allgemein gesprochen ist es wichtig die Verbindung zur Datenbank im richtigen Zeitpunkt zu schließen.

Eine Datenbank kann auch nur begrenzte Anzahl an Verbindungen aufbauen. Allein daher bietet es sich an, unbenutzte Verbinudngen zu schließen.

Schöne Grüße
 

KonradN

Super-Moderator
Mitarbeiter
Ich nutze bei Datenbanken immer Connection Pooling. Im .Net Umfeld ist das in den Treibern integriert, in Java ist es üblich, dass der eigentliche Treiber gekapselt wird. Dazu dient dann z.B. C3P0, HikariCP, oder Apache Commons DBCP.

Immer wenn Du dann eine JDBC Datenbankverbindung brauchst, kannst Du dann try with resources verwenden.

Die Verbindung, die Du hast, wird also aus Deiner Sicht immer sofort geschlossen. Aber da Du nur einen Proxy bekommst, schliesst Du nicht die Connection sondern gibst diese nur zurück an den Pool. Wenn Du dann wieder eine Connection brauchst, dann wird die aus dem Pool genommen.

Das vereinfacht vieles. z.B.:
  • Prüfen, ob z.B. eine Connection noch offen / gültig ist zusammen mit einer Logik, da mögliche Probleme behandelt
  • Du musst nicht prüfen, wo Du dies nutzt. Gerade in Anwendungen mit mehreren Threads musst Du ja sicher stellen, dass eine Verbindung nicht von mehreren Threads gleichzeitig genutzt wird.


Ansonsten gilt hier halt generell der Hinweis, dass Du bei allen Dingen, die Autoclosable implementieren darauf achten musst, dass Du diese Instanzen nach Verwendung schliesst. Das sind auch Dinge, die z.B. von diversen statischen Codeanalyse Tools geprüft und ggf. bemängelt wird.
 

Robert Zenz

Top Contributor
Hey, meine Frage ist, ob man nach einem SQL Statement die Verbindung zur Datenbank schließen muss.
Wenn man jetzt wieder etwas von der Datenbank braucht, einfach wieder Verbinden oder nicht? Sollte ja keine Probleme geben.
Die Antwort ist, ergaenzend zu den anderen, meine Lieblingsantwort: Es kommt darauf an...

Das oeffnen einer Datenbank-Verbindung ist teuer, nicht "wir starten eine JVM"-teuer, aber auch nicht "ein Methodenaufruf"-billig. Wenn du zum Beispiel folgenden Code hast (Pseudo-Code weil faul):

Java:
public static final void executeSql(String sql) {
    try (Connection connection = DriverManager.newConnection("connectionstring")) {
        connection.executeSql(sql);
    }
}

// Some time later

for (String line : fileContent) {
    executeSql(line);
}

Dann ist das dumm, weil du fuer jede einzelne Abfrage eine Datenbankverbindung oeffnen musst. Das kostet Zeit und Resourcen. Wie @KonradN schon aufzeigte, kann man das mit Connection-Pooling zu einem bestimmten Grad ausbessern, aber dennoch ist es schlecht so eine Methode oder Herangehensweise zu haben.

Auf der anderen Seite, wenn du genau eine Abfrage alle zwoelf Stunden machst, ist es unsinnig eine konstante Verbindung offen zu halten. Wenn du ein Kommandozeilen-Programm hast welches Dinge auf der Datenbank tut und sich dann beendet, brauchst du keinen Connection-Pool. Wenn du einen Server hast auf dem konstant Anfragen eingehen welche auf die Datenbank zugreifen, brauchst du einen Connection-Pool weil fuer jede Anfrage eine neue Verbindung aufzumachen ist zu teuer, und da die Verbindungen eigentlich nie Thread-Safe sind, brauchst du ohnehin mehrere, naemlich pro Thread eine.

Also allgemein gefasst, ist es wichtig eine Datenbank danach zu schließen?
Das haengt auch von der Datenbank ab. Wenn die Datenbank nicht auf AutoCommit gestellt ist, also Transaktionen fuer alle Anfragen verwendet, kann ein nicht ordnungsgemaeszes Beenden einem Abbruch der Transaktion gleichkommen (auszer bei Oracle DB, wenn ich mich richtig erinnere, wo ein Verbindungsabbruch ein Commit ist...aus welchem Grund auch immer). Auf der anderen Seite kann es auch sein dass wenn du die Transaktion nicht abschlieszt (sei es nun durch Commit oder durch das schlieszen der Verbindung) dass du dann Zeilen oder sogar ganze Tabellen blockierst.

Es ist btw egal welche Datenbank. Es geht allgemein darum.
Das ist schwierig. Kurz, du musst es richtig machen je nach Anwendungsfall.

1. Wieviele Datenbank-Verbindungen wirst du gleichzeitig brauchen?
2. Wieviele Datenbank-Verbindungen werden von unterschiedlichen Threads verwendet?
3. Werden Datenbank-Verbindungen (Thread-uebergreifend) wiederverwendet?
4. Wie lange lebt die Datenbank-Verbindung?
5. Wie lange lebt die Applikation?

Das sind mal so ein paar Grundsatzfragen die du dir stellen musst, und je nachdem welche Kombination dabei herauskommt, hast du andere Anforderungen und daher auch andere Loesungen an das Thema.
 

M.L.

Top Contributor
Zusatz: das Prinzip der Sparsamkeit (z.B. rechtzeitiges Schliessen einer DB-Verbindung) hat(te) bei knappen Hardware-Resourcen (CPU, Memory,...) Sinn.
 

mrBrown

Super-Moderator
Mitarbeiter
Zusatz: das Prinzip der Sparsamkeit (z.B. rechtzeitiges Schliessen einer DB-Verbindung) hat(te) bei knappen Hardware-Resourcen (CPU, Memory,...) Sinn.
Sparsamer kann es u.U. sein, die eben nicht zu schließen. Die offen aber ungenutzt liegen lassen, kann weniger Resourcen brauchen, als sie mehrmals zu schließen und zu öffnen.
 

Tiri2

Neues Mitglied
Danke für eure Hilfreichen Antworten.

Jedoch ist mir noch eine Frage in den Sinn gekommen. Und zwar bin ich gerade dabei ein Minecraft Plugin für einen Freund zu programmieren. Da nutze ich als Datenbank sqlite3, da ich keine Db wie MySQL brauche. Zu meiner Frage, gibt es jdbc sqlite3 Packet auch ein pool zum erstellen? Wenn nein, ist es jedoch sinnvoll nur eine Verbindung zu haben?


Java:
try {
            con = DriverManager.getConnection("jdbc:sqlite:apocalypse.db");

            Statement statement = con.createStatement();
            statement.execute("CREATE TABLE IF NOT EXISTS coins(uuid TEXT PRIMARY KEY NOT NULL, coins INT NOT NULL)");
            statement.execute("CREATE TABLE IF NOT EXISTS stats(uuid TEXT PRIMARY KEY NOT NULL, kills INT NOT NULL, death INT NOT NULL)");
            statement.close();
            con.close();

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

So wird ja die Verbindung erstell. Die Zeile wird ausgeführt wenn das Plugin gestartet wird.
Wenn ich jetzt zum Beispiel bei einem Command auf die Datenbank zugreifen will, muss ich dann einfach wieder
Code:
Statement statement = con.createStatement();
machen, weil die Verbindung ja dann schon steht. Danach einfach wieder
Code:
con.close();

Mit freundlichen Grüßen,
Tiri
 

Oneixee5

Top Contributor
Sqlite ist durchaus etwas wie ein Sonderfall bei Datenbanken und nicht die beste Wahl für Java. Ich empfehle dir eher eine eingebette DB wie H2 oder Java-DB zu benutzen.
Es gibt in dem Fall noch zu wenig Infos und mir fehlt etwas der Einblick in Minecraft. Wenn dein Plugin in mehreren Threads läuft (z.B. Minecraft-Server), dann sollte jeder Zugriff eine eigene DB-Verbindung aufbauen. Da die Threadfähigkeiten als begrenzt gelten. Wenn aber DB-Zugriffe in hoher Frequenz erfolgen, dann solltest du die Verbindung wiederverwenden und PreparedStatements benutzen. ConnectionPools sind bei Sqlite eher unüblich, da hier eher Zugriffe auf das Dateisystem erfolgen. Anstatt über das Netzwerk wie bei einer richtigen DB. Sqlite ist mehr ein Dateizugriff (verpackt in eine DB-Schnittstelle) als ein Datenbankzugriff.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Datenbank Zugraff nach Umwandlung in .jar-Datei nicht mehr möglich Datenbankprogrammierung 4
N Datenbank abfragen nach bestimmten Wort Datenbankprogrammierung 7
A Nach Export mysql Verbindung zur Datenbank nicht möglich, was tun? Datenbankprogrammierung 7
P JPA- Entities bleiben nach dem Löschen (unsichtbar?) in der Datenbank Datenbankprogrammierung 6
I Zugriff auf Datenbank nach Erstellen einer Executable Jar Datei verweigert Datenbankprogrammierung 10
E Nach Server wechsel Datenbank fehler ?!? Datenbankprogrammierung 3
B Spaltennamen von MySQL Datenbank nach Java auslesen Datenbankprogrammierung 10
T Tabellen aus Datenbank 1 nach Datenbank 2 Datenbankprogrammierung 2
R Nach String in MySQL datenbank suchen Datenbankprogrammierung 7
Baerdoc Empfehlungen zur Auswahl Datenbank Datenbankprogrammierung 6
torresbig MySQL hibernate - could not resolve entity class ... (Datenbank Anfänger) Datenbankprogrammierung 19
M Meine Datenbank lässt sich mit meiner Methode nicht ändern Datenbankprogrammierung 1
I SaaS Applikation: pro Kunde eine Datenbank / Schema oder eine DB für alle Kunden? Datenbankprogrammierung 76
Auf MySql Datenbank zugreifen funktioniert nicht Datenbankprogrammierung 8
MongoDB-Datenbank in Androidstudio einbinden Datenbankprogrammierung 1
thor_norsk Datenbank: Apache Derby Datenbankprogrammierung 6
B SQlite Datenbank, trotz Statements wurden nicht alle Zeilen erzeugt? Datenbankprogrammierung 35
M Datenbank mit REST API Datenbankprogrammierung 66
M Entfernte Datenbank Datenbankprogrammierung 11
T Datenbank: Tabelle erstellen bei Web-Applikation Datenbankprogrammierung 4
D SQLite Datenbank in Android Studio (Java) durchsuchen Datenbankprogrammierung 3
M MySQL Datenbank in Array Datenbankprogrammierung 2
S Den letzten Eintrag aus Datenbank ziehen (Oracle SQL Dev.) Datenbankprogrammierung 14
Beginner22 Zugriff auf Datenbank aus Java über mariadb Datenbankprogrammierung 3
ma095 value NULL- Datenbank Postgresql Spring - intellij community Datenbankprogrammierung 0
raptorrs Plötzlich keine Verbindung zur Datenbank mehr möglich Datenbankprogrammierung 14
Davee SQLite SQLite Datenbank lässt sich nicht auf anderen PCs öffnen Datenbankprogrammierung 8
P Datenbank Tool - besser als oracle SQL Developer gesucht mit effizinte Verbindungsverwaltung Datenbankprogrammierung 2
X JPA (EclipseLink) und Oracle Datenbank Datenbankprogrammierung 2
T Datenbank auf einer Webseite aus einer Exceltabelle erstellen Datenbankprogrammierung 5
L SQL Datenbank Datenbankprogrammierung 7
L SQL Datenbank INSERT INTO Datenbankprogrammierung 6
L SQL Datenbank Tabelle insert Datenbankprogrammierung 7
L SQL Datenbank Tabelle erstellen Datenbankprogrammierung 6
nonickatall MySQL Auf neue Datensätze in einer Datenbank reagieren Datenbankprogrammierung 5
W MYSQL Datenbank Login Android Datenbankprogrammierung 3
anton1 Online Datenbank Datenbankprogrammierung 7
krgewb H2-Datenbank öffnen Datenbankprogrammierung 8
J Datenbank abfragen Datenbankprogrammierung 6
P Verbindung zu einer Access Datenbank per Eclipse oder Intellij Datenbankprogrammierung 0
O SQL Abfragen mit Mini Datenbank Datenbankprogrammierung 12
Z Datenbank Choicebox wird nicht befüllt Datenbankprogrammierung 15
S Suche In SQL Datenbank mit array Datenbankprogrammierung 6
P Enum in der Datenbank Datenbankprogrammierung 1
Z SQL- Datenbank 1.PK zu 2.FK Datenbankprogrammierung 3
E netbeans - jsp Daten in Datenbank hinzufügen Datenbankprogrammierung 2
bueseb84 Spring Boot : Update Mysql Datenbank Datenbankprogrammierung 1
Avalon Attribute werden mit Unterstrich in eine MySQL Datenbank eingetragen Datenbankprogrammierung 10
MiMa wo Datenbank verbinden/trennen? Datenbankprogrammierung 1
H MySQL Verbindung Datenbank und Eclipse (Java) Datenbankprogrammierung 5
DeltaPilot12 Datenbank connect Funktion Datenbankprogrammierung 7
J Oracle Datenbank-Tabelle per Combobox (oder ähnliches) auswählen Datenbankprogrammierung 3
N SQL Datenbank Spalte in Java Array Datenbankprogrammierung 2
J JAR-Datei und Datenbank Datenbankprogrammierung 8
Bluedaishi Datenbank Abfrage Datenbankprogrammierung 36
Kirby.exe Zeile aus der Datenbank holen wenn ein match besteht Datenbankprogrammierung 7
Kirby.exe Es werden keine Einträge in der Datenbank gemacht Datenbankprogrammierung 23
C Datenbank anlegen und über eine Website mit Daten füllen? Datenbankprogrammierung 25
J Welche Kriterien haben Einfluss auf die Geschwindigkeit einer Datenbank ? Datenbankprogrammierung 4
B Frage zu Datenbank Design bei Events (ZenDesk) Datenbankprogrammierung 1
M SQLite Datenbank mit SQLite Datenbankprogrammierung 7
C String in Datenbank einfügen Datenbankprogrammierung 11
C Keinen Zugrift auf Datenbank Datenbankprogrammierung 2
C Datenbank zugreifen Datenbankprogrammierung 10
L Auf Strato Datenbank zugreifen Datenbankprogrammierung 7
H Fehler bei getConnection zu MySQL Datenbank Datenbankprogrammierung 18
G Datenbank Statement Datenbankprogrammierung 22
M Datenbank editierbach machen in JTable Datenbankprogrammierung 13
S Datenbank MySQL und Java Datenbankprogrammierung 8
M H2 Verbindung zur Datenbank komplett schließen Datenbankprogrammierung 11
J Aufbau meiner Datenbank/Tabelle - Verbessern? So lassen? Datenbankprogrammierung 39
J Nur CRUD über Datenbank Klasse, oder auch mehr ? Datenbankprogrammierung 2
Dimax MySQL Maximale Datenlänge für eine Spalte einer Datenbank in java ermitteln Datenbankprogrammierung 15
L Appabsturz mit Datenbank Datenbankprogrammierung 4
J Zahlungseingänge von mehreren Kunden wie am besten abbilden in der Datenbank ? Datenbankprogrammierung 8
L Datenbank sichern Datenbankprogrammierung 8
S Daten von SQLite Datenbank nutzen Datenbankprogrammierung 5
J Datenbank VPS Server Datenbankprogrammierung 3
H MySQL MySQL - Keine Verbindung zur Datenbank?! Datenbankprogrammierung 4
NIckbrick MySQL Befehle aus Datenbank auslesen Datenbankprogrammierung 21
S Datenbank/Java true/false Datenbankprogrammierung 8
J JUNIT und CRUD-Datenbank Datenbankprogrammierung 4
F Datenbank/Datenabgleich/Wiederholungsabfrage Datenbankprogrammierung 12
@SupressWarnings() Eure bevorzugte Datenbank-Library Datenbankprogrammierung 9
C datenbank verbindung config Datenbankprogrammierung 23
L MySQL Android zu externer MySQL Datenbank verbinden Datenbankprogrammierung 5
M Datenbank vor unerlaubtem Zugriff durch Benutzer schützen Datenbankprogrammierung 3
U MySQL Aus Servlet in Datenbank schreiben Datenbankprogrammierung 4
H Datenbank Export mit Java Datenbankprogrammierung 3
P Daten in eine mySQL Datenbank einfügen Datenbankprogrammierung 4
S SQL-Statement Datenbank Zeitbereich durchsuchen Datenbankprogrammierung 2
L Messenger App - Wie am besten auf Datenbank zugreifen? Datenbankprogrammierung 4
H MySQL Datenbank auf Xampp nimmt keine Mediumblob an. Datenbankprogrammierung 0
D Datenbank Abfrage Datenbankprogrammierung 7
H MySQL Benutzer Login System mit Datenbank Informationen (Abfrage zu User ist auf DB gesichert) Datenbankprogrammierung 42
L Oracle Datenbank über Java aufrufen Datenbankprogrammierung 29
DaCrazyJavaExpert Derby/JavaDB Unfindbarer Fehler im Datenbank-Code Datenbankprogrammierung 87
DaCrazyJavaExpert Derby/JavaDB Wert einer Variable in der Datenbank direkt auf 1 setzten. Datenbankprogrammierung 71
W MySQL Ausgabe von Datenbank in Java-App Datenbankprogrammierung 6
M portable Datenbank Datenbankprogrammierung 2

Ähnliche Java Themen


Oben