Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > Java
You last visited: Today at 10:11

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



[Java] Verständnisfrage Datenbankverbindung

Discussion on [Java] Verständnisfrage Datenbankverbindung within the Java forum part of the Coders Den category.

Reply
 
Old   #1
 
elite*gold: 0
Join Date: Mar 2019
Posts: 153
Received Thanks: 9
[Java] Verständnisfrage Datenbankverbindung

Wielange bleibt eine Datenbankverbindung erhalten?

Ich möchte quasi ein Konsolenprogramm starten,was sich beim Start mit einer DB verbindet und diese bis zum schließen des Programmes erhalten bleibt.
Ich hab die Verbindung in meine Main geschrieben. Muss ich einfach nur in der Main die Verbindung herstelln und am Ende der Main das Programm schließen?



TeilzeitGangster is offline  
Old 11/27/2019, 22:18   #2
 
elite*gold: 100
Join Date: Apr 2008
Posts: 679
Received Thanks: 921
Generell kann die Verbindung offen bleiben. Wenn du nicht damit rechnest, dass die Verbindung abbricht (Internet ausfall, Paketverluste, Server neustart, etc) kannst du das so machen. Ansonsten würde ich sicherheitshalber davon ausgehen, dass die Verbindung weg sein kann und im Falle das Falls wieder aufgebaut wird.


florian0 is offline  
Old 11/28/2019, 01:30   #3
 
elite*gold: 0
Join Date: Feb 2009
Posts: 1,120
Received Thanks: 550
Wenn das programm beendet wird, beendet sich auch die Datenbankverbindung. Aber das ist keine saubere Praxis, denn damit ist dein Code nicht reusable (Beispiel du willst die Funktionalität in eine eigene Methode packen die in einer Schleife 10k mal ausgefürt wird. Herzlichen glückwunsch du hast jetzt 10k offene verbindungen)

In deinem speziellen Fall das die Datenbankverbindung in der Main erstellt wird, solltest du sie auch am ende der Main beenden. Dafür provided Java Try-Finally blöcke:
Code:
// initialize connection
try {
  // do something with connection
} finally {
  // transaction.close
  connection.close();
}
Die garantieren das der finally block auf jeden fall ausgeführt wird, selbst wenn 1. Die methode durch return in dem aktuellen Block verlassen wird, 2. Exceptions gefeuert werden

Normalerweise kapselst du dein Programm aber ja in Klassen, Stichwort OOP. Wenn die Datenbankverbindung teil des States eines Objektes ist, sollte die Klasse eine Methode zur freigabe der Resourcen zur verfügung stellen. Theoretisch gibt es mit einen Destruktor, aber diese Methode ist seit Java 9 deprecated, und wird von der JVM auch nur nach dem best effort prinzip aufgerufen, ist daher defacto useless.
Daher solltest du der klasse eine Methode Cleanup oder so geben, die dann von dem Besitzer aufgerufen werden muss (z.b. in dessen CleanUp methode, oder in einem Try-Finally block).
warfley is offline  
Thanks
1 User
Old 11/29/2019, 09:50   #4
 
elite*gold: 0
Join Date: Mar 2019
Posts: 153
Received Thanks: 9
Wenn ich also nun die Datenbankverbindung in eine eigene Methode packe(nennen wir es Connection.java)
Wenn ich nun das Programm compile wird die Datenbankverbindung automatisch hergestellt, ohne dass ich vorher etwas in der main dafür aufrufe? Sorry da fehlt mir irgendwie noch das Verständnis für. Danke schonmal!


TeilzeitGangster is offline  
Old 11/29/2019, 13:22   #5
 
elite*gold: 0
Join Date: Feb 2009
Posts: 1,120
Received Thanks: 550
Quote:
Originally Posted by TeilzeitGangster View Post
Wenn ich also nun die Datenbankverbindung in eine eigene Methode packe(nennen wir es Connection.java)
Wenn ich nun das Programm compile wird die Datenbankverbindung automatisch hergestellt, ohne dass ich vorher etwas in der main dafür aufrufe? Sorry da fehlt mir irgendwie noch das Verständnis für. Danke schonmal!
Nein, du musst das Objekt irgendwo erstellen oder die Methode irgendwo aufrufen. Sagen wir mal du hast irgendwie so eine Klasse:
Code:
import java.sql.Connection;
import java.sql.DriverManager;
import java.nio.file.Path;

public class DBConnection {
  private final Connection sqlConnection;

  public DBConnection(Path configPath) {
    // Load connection info from configPath, e.g. via xml reader or sth. like that
    sqlConnection = DriverManager.getConnection(jdbcURL, user, pass);
  }

  [...]

  public void cleanUp() {
    sqlConnection.close();
  }
}
Dann musst du diese klasse irgendwo benutzen, z.b. in der Main:
Code:
import java.nio.file.Paths;

public class Foo {
  public static void main(String args[]) {
    DBConnection conn = new DBConnection(Paths.get("./config"));
    try {
      [...]
    finally {
      conn.cleanUp();
    }
  }
}
Am besten stellst du es dir so vor, jede Resource ist ein Objekt, und jedes Objekt gehört irgendeinem anderen Objekt oder einer Methode. Wem ein Objekt gehört ist dafür verantwortlich es wieder aufzuräumen wenn es nicht mehr benötigt wird. Es darf zu jedem Zeitpunkt nur ein besitzer pro Objekt exsistieren, sonst hast du entweder: 1. keinen besitzer, dann wird nicht aufgeräumt, oder 2. mehrere besitzer, dann wird eventuell 2 mal aufgeräumt, oder es wird aufgeräumt während ein anderer das Objekt noch benutzt.

Konkret für Java heißt das, ein Objekt das eine Resource oder ein Objekt benutzt das aufgeräumt werden muss, muss eine CleanUp methode bereitstellen in der die cleanUp aller aufzuräumenden Objekte (oder in diesem fall die close methode) aufgerufen wird. Jede Methode die ein Objekt benutzt muss das aufgeräumt werden muss, muss mittels try-finally garantieren das nach der benutzung die cleanup methode aufgerufen wird.

Hier besitzt das DBConnection Objekt das sqlConnection Objekt, muss das also in der cleanUp aufräumen. Die Main funktion besitzt wiederum das sqlConnection objekt, muss also wenn sie fertig ist es zu benutzen dieses wiederum aufrufen. Um das zu garantieren wird try-catch benutzt
warfley is offline  
Old 11/29/2019, 14:04   #6
 
elite*gold: 0
Join Date: Mar 2019
Posts: 153
Received Thanks: 9
Vielen Dank für die Erklärung.
Müsste ich aber dann nicht noch in der Main das extends DBConnection einfügen?
Danke dir!
TeilzeitGangster is offline  
Old 11/29/2019, 14:10   #7
 
elite*gold: 0
Join Date: Feb 2009
Posts: 1,120
Received Thanks: 550
Quote:
Originally Posted by TeilzeitGangster View Post
Vielen Dank für die Erklärung.
Müsste ich aber dann nicht noch in der Main das extends DBConnection einfügen?
Danke dir!
Nein, nur wenn du das Objekt vererben willst, das willst du hier ja nicht. Hier würdest du die Klasse DBConnection nur benutzen um alle Datenbank relevante infos in einer Klasse zu haben. Diese klasse würdest du dann nicht erweitern (was extends macht) sondern benutzen. Die Idee ist, wenn du DBConnection benutzt musst du nicht wissen was DBConnection macht. DBConnection kann z.B. MySQL, SQLite oder Einhornmagie intern benutzen, die idee ist, solang es abgekapselt ist musst du außerhalb von DBConnection dich nicht darum kümmern.

Im gegensatz dazu wölltest du DBConnection erweitern, wenn du mehr funktionaltiät hinzufügen willst. Z.B. willst du zwei klassen haben ReadingConnection und WritingConnection die anderes Commit verhalten für Transactions haben. Dann würdest du zwei neue Klassen schreiben die beide DBConnection um ihre eigene funktionalität erweitern
warfley is offline  
Old 12/02/2019, 12:35   #8
 
elite*gold: 0
Join Date: Mar 2019
Posts: 153
Received Thanks: 9
Darf ich dich I'm Discord adden? Hätte noch ein paar dinge...
TeilzeitGangster is offline  
Old 12/02/2019, 17:17   #9
 
elite*gold: 0
Join Date: Feb 2009
Posts: 1,120
Received Thanks: 550
Quote:
Originally Posted by TeilzeitGangster View Post
Darf ich dich I'm Discord adden? Hätte noch ein paar dinge...
jo, bin nur äußerst unregelmäßig on


warfley is offline  
Reply



« App oder Desktopanwendungen | Java Programmierer werden »

Similar Threads
Pointer Verständnisfrage
08/31/2013 - C/C++ - 5 Replies
Hallo ich habe eine Frage zu Pointern. Wenn ein Spiel mit new auf dem Heap Speicher für eine Struktur anfordert, die Informationen über den Spieler enthält, dann liegt der Pointer auf diese Struktur wahrscheinlich auf dem Stack. Aber die Adresse des Stacks ändert sich bei PC-Neustart (bei ASLR aktiv). Wie finde ich also den Pointer, der auf die Struktur auf dem Heap zeigt?
Verständnisfrage
01/27/2013 - Metin2 Private Server - 5 Replies
Hab nur ne Frage... Also wenn ich was in locale ändere, dann ist das nur Clientside, und hat null Auswirkungen aufs Spiel ? Aber wenn ich jetzt was in den PC Datein ändere, könnte es Auswirkungen haben, wie z.b. ExternalForce oder ?
Verständnisfrage
12/01/2012 - Metin2 Private Server - 11 Replies
Moin Com Ich hab mal ne Frage... Also ich bin hier grad schön am Client modden und da ist mir eine Frage aufgekommen. Was hat die Index Datei für einen Sinn ? Ich mein Situation: hab in den Client einen dmg-mod reingehaun(pack) und dann die Index ersetzt... Gut nun war ich ingame unsichtbar... Hmmm also die Ursprüngliche Client Index reingesetz... Nun wieder sichtbar aber Dmg-mod geht nicht... Naja gut dann AntiFlyDmg in die Ursprüngliche Index mit eingeführt, doch geht immer noch...
[Verständnisfrage]Decrypten von Gamefiles
04/21/2010 - General Coding - 5 Replies
Hiho E*Pvp Ich beschäftige mich seit geraumer Zeit im Moddingbereich (ausserhalb von elitepvpers) und habe schon öfters sogenannte File-Extractors benutzt, welche aus gecrypteten dateien die originale wiederherstellen. Ich habe jetzt schon ein wenig erfahrung in C++, und schon meine eigenen Versuche mit einfacher Text En bzw. Decryptung gestartet. Was mir eben spontan einfiel, war dass ich jeweils einen Char in einen Int caste, den modifiziere und wieder in einen Char caste, das dann mit...



All times are GMT +1. The time now is 10:11.


Powered by vBulletin®
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.

BTC: 33E6kMtxYa7dApCFzrS3Jb7U3NrVvo8nsK
ETH: 0xc6ec801B7563A4376751F33b0573308aDa611E05

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2019 elitepvpers All Rights Reserved.