zu viele MySQL Connections

didi577

Bekanntes Mitglied
Hi,
ich habe eine Anwendung mit drei GUI Klassen und vielen Widgets (Buttons, JComboboxen etc) und vielen Action die auf eine MySQL zugreifen um abzufragen, löschen und speichern. Bei jeder Aktion erstelle ich eine neue Connection. So zB:
Java:
    public void kurzauswertung() {
           Connection con = null;
           try {
               con = DriverManager.getConnection("jdbc:mysql://localhost:3306/schulaus?user=root&password=#Patrick1");
               PreparedStatement pst = con.prepareStatement("select count(*) FROM fragen");
               ResultSet rs = pst.executeQuery();
               while(rs.next()) {
               lblAnzahl.setText(rs.getString(1));
               }
               
           } catch (SQLException e) {
               e.printStackTrace();
             }
           
       }
in der Konsole sehe ich ja das "Feuerwerk" (u.A. wegen fehlender SSL identity) bei jeder connection.
Ich benötige in allen drei Klassen die Connection. Wie kann ich das am einfachsten bauen? Oder ist es richtig bei jeder Aktion die Verbindung neu herzustellen?
 

Dukel

Top Contributor
Wieso machst du nicht am Anfang eine Connection auf und nutzt diese die ganze Zeit bis zum Ende der Applikation und machst da die Connection wieder zu.

Edit:
Ach ja. Wenn du wirklich dauernd neue Connections aufmachst, dann mach die am Ende auch wieder zu.
 

didi577

Bekanntes Mitglied
ich hatte schon überlegt in der main Klasse die connection herzustellen.
nur wie kann ich dann den oben dargestellten code bauen da mir hier ja "con" fehlt? Das habe ich ja in der main Klasse
 
Kennst du dich mit Entwurfsmustern aus? Z.B. den Singleton? Im Grunde ist ein Singleton eine Klasse, von der es nur eine Instanz geben soll. Spontan würde ich sagen, trifft das auch auf deinen Fall zu. Du erstellst eine Klasse, die dir die aktuelle Connection zurück gibt (die ja einmal existieren soll) und diese Klasse kannst du in jeder Klasse aufrufen. So eine Klasse habe ich mal spontan zusammen geschrieben:

Java:
public class ConnectionSingleton {
   private ConnectionSingleton() { }
  
   private static Connection conn = null;
  
   public static Connection getConnection() {
       if (conn = null) {
           conn = DriverManager.getConnection("some String");
       }
      
       return conn;
   }
}
Und jedesmal, wenn du eine Connection brauchst, rufst du einfach
Java:
ConnectionSingleton.getConnection()
auf. Also die erste Zeile in deiner Funktion kannst du löschen und die erste Zeile in deinem try-Block würde dann so aussehen:
Java:
Connection con = ConnectionSingleton.getConnection();
 

didi577

Bekanntes Mitglied
ich glaube das ist die Lösung meines Problems. sieht schlüssig aus. ich probiere das morgen früh gleich aus. man lernt hier jeden Tag etwas neues dazu. vielen vielen Dank :)
 

mrBrown

Super-Moderator
Mitarbeiter
Nutz besser kein Singleton (zumindest nicht nach Singleton-Pattern), sondern Dependency-Injection, auf lange Sicht machst du dir damit das Leben leichter ;)
 

didi577

Bekanntes Mitglied
@kristianonline
oh klappt noch nicht
Java:
package auswertung;

import java.sql.Connection;
import java.sql.DriverManager;

public class ConnectionSingleton {
   
    private ConnectionSingleton() { }
   
      private static Connection conn = null;
   
      public static Connection getConnection() {
          if (conn = null) {
              conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/schulaus?user=root&password=#Patrick1");
          }
       
          return conn;
      }

}
irgendwas fehlt hier noch?
 

Joose

Top Contributor
Wie kann ich das am einfachsten bauen? Oder ist es richtig bei jeder Aktion die Verbindung neu herzustellen?
Wie schon mal in einem anderen Thread erklärt kommt es auf den Anwendungsfall an wie viele Connections du wann aufmachst usw.

Sobald du zum Beispiel eine Auswertung "anstoßt" (als eine Aktion auslöst) kannst du eine Connection öffnen und alle für die Auswertung benötigten Abfragen mit der selben Connection ausführen.
Sprich du musst nicht in jeder Methode welche eine Datenbankabfrage enthält eine Connection aufbauen sondern dort wo es Sinn macht ;) (in C# gibt es da zum Beispiel das UnitOfWork Pattern)
(und am Ende musst du sie natürlich schließen! Sehe ich bei deinem Beispiel oben nicht)

Eine eigene Klasse welche sich um die Datenbankverbindung und das Ausführen von Statements kümmert wäre hier schon mal von Vorteil.

Außerdem rate ich dir ebenfalls ab ein Singleton zu verwenden!
 

didi577

Bekanntes Mitglied
vielen Dank für die Info

ich habe jetzt eine Klasse "MySQL"
Java:
public class MySQL {
  
   private String HOST = "";
   private String DATABASE = "";
   private String USER = "";
   private String PASSWORD = "";
  
   private Connection con;
  
  
   public Connection getCon() {
       return con;
   }


   public MySQL (String host, String database, String user, String password) {
       this.HOST = host;
       this.DATABASE = database;
       this.USER = user;
       this.PASSWORD = password;
      
       connect();
      
   }

   public void connect() {
       try {
           con = DriverManager.getConnection("jdbc:mysql://" + HOST + ":3306/" + DATABASE + "?autoReconnect=true", USER, PASSWORD);
           System.out.println("[MySQL] Die Verbindung zur MySQL wurde hergestellt");
       } catch (SQLException e) {
           System.out.println("[MySQL] Die Verbindung zur MySQL ist fehlgeschlagen! Fehler: " + e.getMessage());
       }
   }
  
   public void close() {
       try {
           if(con != null) {
               con.close();
               System.out.println("[MySQL] Die Verbindung zu MySQL wurde erfolgreich beendet!");
           }
       } catch (SQLException e) {
           System.out.println("[MySQL] Fehler beim beenden der Verbindung zu MySQL! Fehler: " + e.getMessage());
       }
   }
in den 3 GUI Klassen erzeuge ich dann ein Objekt so zB im Hauptfenster:
Java:
public static MySQL mysql;
Java:
public ErfGUI() {
      
       ConnectMySQL();
       }
Java:
private void ConnectMySQL() {
          
           mysql = new MySQL("localhost", "schulaus", "root", "#Patrick1");
       }
in der Methode gehe ich dann so vor:
Java:
       Connection con = mysql.getCon();
           try {
               PreparedStatement pst = con.prepareStatement("select count(*) FROM fragen");
               ResultSet rs = pst.executeQuery();
               while(rs.next()) {
               lblAnzahl.setText(rs.getString(1));
               }
              
           } catch (SQLException e) {
               e.printStackTrace();
               mysql.close();
             }
          
       }
in einer Methode zum Laden von COmboboxen habe ich jetzt diesen Code:
Java:
public void boxenLaden() {
           Connection con = mysql.getCon();
           try {
//               con = DriverManager.getConnection("jdbc:mysql://localhost:3306/schulaus?user=root&password=#Patrick1");
               PreparedStatement pst = con.prepareStatement("select kursnr from kurse ORDER BY kursnr");
               ResultSet rs = pst.executeQuery();
               while(rs.next()) {
               boxKursM.addElement(rs.getString(1));
               }
               PreparedStatement pst1 = con.prepareStatement("select name from dozenten ORDER BY name");
               ResultSet rs1 = pst1.executeQuery();
               while(rs1.next()) {
               boxDozentM.addElement(rs1.getString(1));
               }
               PreparedStatement pst2 = con.prepareStatement("select orte from orte ORDER BY orte");
               ResultSet rs2 = pst2.executeQuery();
               while(rs2.next()) {
               boxOrtM.addElement(rs2.getString(1));
               }
              
           } catch (SQLException e) {
               e.printStackTrace();
             }
       }
es funktioniert aber kann man es optimieren?
 
Zuletzt bearbeitet von einem Moderator:

Joose

Top Contributor
ich habe jetzt eine Klasse "MySQL"
Kleiner Tipp, weil ich es bei dieser Klasse sehe: Du fängst zwar Exceptions und gibst dann eine Fehlermeldung aus, lässt aber den StackTrace weg.
Gib den StackTrace auch aus der ist immer hilfreich ;)

in der Methode gehe ich dann so vor:
Java:
           } catch (SQLException e) {
               e.printStackTrace();
               mysql.close();
             }         
       }
Du schließt zwar die Verbindung wieder, aber nur wenn eine Exception geflogen ist.
Verschiebe das "mysql.close()" in den finally-Block! Außerdem solltest du des ResultSet ebenfalls schließen (Achtung: Vor der Verbindung schließen!)

es funktioniert aber kann man es optimieren?
Was optimieren?
Natürlich geht das ;) du hast da 3x den gleichen Code stehen. Einziger Unterschied ist das SQL Statement und die ComboBox die gefüllt wird.
Lagere das doch in eine Methode aus.
 

didi577

Bekanntes Mitglied
ich habe die eine Methode jetzt so umgebaut:
Java:
    public void kurzauswertung()  {
           Connection con = mysql.getCon();
           ResultSet rs = null;
           try {
               PreparedStatement pst = con.prepareStatement("select count(*) FROM fragen");
               rs = pst.executeQuery();
               while(rs.next()) {
               lblAnzahl.setText(rs.getString(1));
               }
               
           } catch (SQLException e) {
               StringWriter s = new StringWriter();
               e.printStackTrace(new PrintWriter(s));
               System.out.println(s.toString());
               
             } finally {
                   if (rs != null) {
                       try {
                           rs.close();
                       } catch (SQLException e) {
                           e.printStackTrace();
                           }
                   }
                   
                   if (con != null) {
                       try {
                           con.close();
                       } catch (SQLException e) {
                           e.printStackTrace();
                           }
                   }    }
                 
             }
ich denke das sieht besser aus !?
 

mrBrown

Super-Moderator
Mitarbeiter
Du kannst try-with-Resources nutzen, damit sparst du dir da einiges an Code

Abgesehen davon wäre es schöner, Daten und View zu trennen ;)
 
Zuletzt bearbeitet:

didi577

Bekanntes Mitglied
das Schliessen habe ich wieder rausgenommen. Der Sinn der Anwendung ist es ja die ganze Zeit Daten zu speichern oder abzurufen. Ich schliesse die Verbindung jetzt beim Beenden der Anwendung
 

Joose

Top Contributor
Der Sinn der Anwendung ist es ja die ganze Zeit Daten zu speichern oder abzurufen. Ich schliesse die Verbindung jetzt beim Beenden der Anwendung
Bei einer Anwendung die du alleine verwendest und auf eine lokale Datenbank zugreift sicher kein großes Problem. Ansonsten würde ich davon abraten ;)
Aber wenn du die Verbindung beim Beenden schließt bitte auch nur 1x öffnen ;)
 

didi577

Bekanntes Mitglied
Aber wenn du die Verbindung beim Beenden schließt bitte auch nur 1x öffnen ;)
genau das ist mein Problem;)
ich öffne noch neue Verbindungen wenn ich zwei Dialoge jeweils öffne. So dass ich auf 3 Verbindungen komme. Das ist der Start des einen Dialog:
Java:
public LoeGUI() {
   
       ConnectMySQL();
       initLoeGUI();
   
   }
   
   private void ConnectMySQL() {
       
       mysql = new MySQL("localhost", "schulaus", "root", "#Patrick1");
   }
...das der andere
Java:
public AusGUI() {
   
       ConnectMySQL();
       initAusGUI();
       addWidgets();
   
   }
   
   private void ConnectMySQL() {
       
       mysql = new MySQL("localhost", "schulaus", "root", "#Patrick1");
   }
LoeGUI und AusGUI starte ich aus ErfGUI (im Menü)
wie kann ich in LoeGUI und ErfGUI auf das "mysql" Objekt aus ErfGUI zugreifen?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
X 1 MySQL-Verbindung und viele Threads Java Basics - Anfänger-Themen 4
B Screenshots machen und zwar viele und speichern Java Basics - Anfänger-Themen 12
H So viele Fehlermeldungen, dass ich nicht weiß wo das Problem ist. Java Basics - Anfänger-Themen 6
J Problem mit einer Methode, die beliebig viele Objekte in Array speichern soll Java Basics - Anfänger-Themen 6
s_1895 zu viele Zeilen in der Main Methode Java Basics - Anfänger-Themen 4
P Methode die ausgibt wie viele Primzahlen es zwischen 2 und n gibt Java Basics - Anfänger-Themen 10
P Nutzer entscheiden lassen, wie viele Zahlen dieser in ein Array eingeben möchte. Java Basics - Anfänger-Themen 6
S Hilfe : Unendlich viele Zufallszahlen erstellen? Java Basics - Anfänger-Themen 8
I Wie viele 1 an Bits hat die Zahl x? Java Basics - Anfänger-Themen 5
R Zu viele leere Parameter Java Basics - Anfänger-Themen 8
T Variablen Beliebig viele Arrays in Schleife erstellen Java Basics - Anfänger-Themen 1
M Aufgabe: Eine Klasse und viele Untermethoden Java Basics - Anfänger-Themen 30
D Klassen Doppelt so viele Elemente in Arraylist ? Java Basics - Anfänger-Themen 4
F Threads ftp4j, viele Dateien upload Java Basics - Anfänger-Themen 5
L Viele Fragen zu den Grundlagen Java Basics - Anfänger-Themen 5
B Beliebig viele Rechtecke erzeugen Java Basics - Anfänger-Themen 5
N Beliebig viele parameter Java Basics - Anfänger-Themen 3
D Viele grafische unterschiede von Windows xp zu Windows 7 Java Basics - Anfänger-Themen 3
T unterschiedlich viele parameter übergeben Java Basics - Anfänger-Themen 5
T Zu viele Fenster - HILFE! Java Basics - Anfänger-Themen 5
Prafy Beliebig viele Arrays erstellen? Java Basics - Anfänger-Themen 2
J Methoden Beliebig viele Objekt-Eingabeparameter im Konstruktor Java Basics - Anfänger-Themen 6
T viele "kleine" Fragen... Java Basics - Anfänger-Themen 3
M Zu viele Verkettungen von Klassen Java Basics - Anfänger-Themen 4
G Erste Schritte Wie viele Montage gab es? Java Basics - Anfänger-Themen 14
M Input/Output Viele short aus Datei lesen und von Little Endian zu Big Endian umwandeln Java Basics - Anfänger-Themen 12
S Variablen viele Instanzvariablen vermeiden Java Basics - Anfänger-Themen 14
El_Lobo Methoden Zu viele Getter- und Settermethoden - geht das einfacher? Java Basics - Anfänger-Themen 3
L buffered reader produziert zu viele und seltsame zeichen Java Basics - Anfänger-Themen 2
D Erste Schritte Viele Objekte einer Klasse "verwalten" Java Basics - Anfänger-Themen 17
T Beliebig viele Werte in Array zwischenspeichern Java Basics - Anfänger-Themen 15
S Viele Fragen von einem Anfänger in Java Java Basics - Anfänger-Themen 2
F Viele Controller-Klassen Java Basics - Anfänger-Themen 5
P Datentypen extrem viele Fehler nur irgendwie seh ich den Grund ned... Java Basics - Anfänger-Themen 3
M Viele GUI-Variablen Java Basics - Anfänger-Themen 4
O Wie kann man das einfach lösen? (dynamisch viele Attribute) Java Basics - Anfänger-Themen 6
U JTable viele möglichkeiten, keine Lösung Java Basics - Anfänger-Themen 5
H Reflexion: Eine Methode, beliebig viele Parameter (Java 1.4.2) Java Basics - Anfänger-Themen 8
M Viele verschachtelte Schleifen Java Basics - Anfänger-Themen 14
Avalarion Erschaffung eines Shadowrun Charaktergenerators - Viele, Viele Fragen! Java Basics - Anfänger-Themen 6
S Viele Konstanten, EnumSet? Java Basics - Anfänger-Themen 3
S Stilfrage: Neue Klasse wenn es in einer Klasse zu viele Methoden gibt? Java Basics - Anfänger-Themen 14
Kasu So viele "_ " ausgeben, wie ein String lang ist Java Basics - Anfänger-Themen 4
I viele Dateinamen in ein String-Array mit File().list() Java Basics - Anfänger-Themen 4
mwildam Textfile lesen und schreiben - so viele Möglichkeiten Java Basics - Anfänger-Themen 5
U Zu viele werte in einer klasse Java Basics - Anfänger-Themen 4
K Viele Fragen eines Anfängers-Fließkommazahlen/Typenwandlung Java Basics - Anfänger-Themen 5
W Viele Objekte mit einem Konstrukor erzeugen Java Basics - Anfänger-Themen 10
R einfaches Programm, viele Probleme Java Basics - Anfänger-Themen 29
G viele zahlen mit wenig code Java Basics - Anfänger-Themen 4
E Viele Fragen Java Basics - Anfänger-Themen 8
J viele Objekte erzeugen Java Basics - Anfänger-Themen 21
J Große *.Text Datei zum verschicken in viele kleine Java Basics - Anfänger-Themen 7
O viele Name mit jeweils zugehörigen Status in .txt Speichern Java Basics - Anfänger-Themen 16
K ResultSet: Wie viele Rows beinhaltet es? Java Basics - Anfänger-Themen 6
X Viele Komponenten automatisch erzeugen Java Basics - Anfänger-Themen 2
C zu viele paint()'s. Java Basics - Anfänger-Themen 6
M Viele Textfelder auslesen Java Basics - Anfänger-Themen 3
P x-viele Variablen anlegen Java Basics - Anfänger-Themen 2
F Mit der Zahl n n-viele Arrays erstellen ?! Java Basics - Anfänger-Themen 4
C No suitable driver found for jdbc:odbc:mysql Java Basics - Anfänger-Themen 8
E Mysql Update wenn es nicht existiert insert Java Basics - Anfänger-Themen 14
Dimax In Java File (nicht in Java Projekt) mysql Driver importieren Java Basics - Anfänger-Themen 3
H Verbindungsprobleme BluJ und MySQL Java Basics - Anfänger-Themen 1
R Java mit MySQL - Verbindungsprobleme Java Basics - Anfänger-Themen 1
B Arquillian installieren - Maven, WildFly, MYSQL Java Basics - Anfänger-Themen 1
M Java Mysql ausführbare datei Java Basics - Anfänger-Themen 7
B MySQL (jdbc) -> connection liefert NULL Java Basics - Anfänger-Themen 3
J Java Verbindung mit mysql Datenbank Java Basics - Anfänger-Themen 3
J MySQL Datumsabfrage über ResultSet in Java-Servlet Java Basics - Anfänger-Themen 4
Dimax Programme ,als Text in MySql speichern Java Basics - Anfänger-Themen 7
R Keine Verbindung zu MySql über Netbeans Java Basics - Anfänger-Themen 15
R Input/Output Verbindung mit mySql-Datenbank Java Basics - Anfänger-Themen 9
Q-bert MYSQL-Eintrag Java Basics - Anfänger-Themen 2
J Sonderzeichenproblem bei Datenabfrage in MySQL Java Basics - Anfänger-Themen 6
F Java MySQL Java Basics - Anfänger-Themen 3
C JTable update mit MySQL Datenbank Java Basics - Anfänger-Themen 1
D MySQL Abfrage in JTable speichern Java Basics - Anfänger-Themen 43
D NPE beim laden von Daten aus MySQL Java Basics - Anfänger-Themen 9
D Eine MySQL Verbindung in mehreren Klassen Java Basics - Anfänger-Themen 8
D JTable Zeile wird nicht in MySQL gelöscht Java Basics - Anfänger-Themen 16
D Datum aus Swing in MySQL DB speichern Java Basics - Anfänger-Themen 22
B MySQL starten / stoppen -> Stoppen erzeugt neuen Prozess Java Basics - Anfänger-Themen 0
B MySQL Path bekommen Java Basics - Anfänger-Themen 40
P Brauche Hilfe bei ResultSet mit MySQL Java Basics - Anfänger-Themen 6
H JAva und MySQL Java Basics - Anfänger-Themen 1
S Best Practice MVC und große Datenmengen aus einer mySQL - Datenbank Java Basics - Anfänger-Themen 24
U Glassfish mit MySQL verbinden Java Basics - Anfänger-Themen 1
N Erste Schritte MySQL Tabelle in JList darstellen Java Basics - Anfänger-Themen 1
A Erste Schritte Verbindung zu MySQL Datenbank herstellen Java Basics - Anfänger-Themen 7
M Mysql "live" Ansicht Java Basics - Anfänger-Themen 10
W MySQL PreparedStatement query Problem Java Basics - Anfänger-Themen 10
K Classpath Mysql EclipseFehler? Java Basics - Anfänger-Themen 12
M Aktuelles Datum in MySQL speichern Java Basics - Anfänger-Themen 11
V Umlaute in mysql, antscript, powershell utf-8 Java Basics - Anfänger-Themen 7
H mysql brauche hilfe, wer kann eine (längere) aufgabe für mich erledigen Java Basics - Anfänger-Themen 2
S in MySQL Daten Bank speichern Java Basics - Anfänger-Themen 8
N mit Werten aus einer mysql datenbank in java rechnen Java Basics - Anfänger-Themen 17
T MySQL - Java Organisationsfrage Java Basics - Anfänger-Themen 4
S ArrayList in mysql Datenbank speichern Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben