JDBC via Singleton

Joptionpane

Aktives Mitglied
Morgen an alle,

also gleich zum Thema:

Ich habe ein JAVA-Programm, welches auf meine Datenbank zugreifen soll. Dies hab ich mittels JDBC realisiert und hab noch den Singleton-Pattern mit eingebaut.

Habe mich nebenher im Internet natürlich schlau gemacht was geeignet wäre für solch eine Verbindung und oft wurde empfohlen ein Connection-Pool zu benutzen um solch eine Verbindung aufzubauen.

Nun das ganze ist ein Projekt im Studium, das Programm ist fertig und läuft einwandfrei. Natürlich werd ich das Projekt nicht Online stellen (Wörterbuch/Dictionary), da es simpel erstellt wurde und niemals den großen Seiten eine Konkurrenz darstellen würde.

Jedoch würde ich gern wissen, warum der Singleton-Pattern nicht so geeignet wäre?
Würde es ggf. zu Komplikationen führen wenn ich bspw. die Seite Online stelle und mehrere Leute sich auf der Seite registrieren und anmelden, sprich Multi-Threaded?
Oder hab ich da was falsch verstanden? Über eine kleine Erläuterung bezüglich dieses Anwendungsbeispieles würde ich mich freuen

Viele Grüße
JOption
 
S

Spacerat

Gast
Also das DataSource-Objekt kann schon ein Singleton sein, da spricht nichts dagegen. Nur sollte dessen "getConnection()"-Methoden nicht immer dieselbe Instanz einer Verbindung liefern, das wäre fatal. Ausserdem müssten diese Methoden dann wohl auch synchronisiert werden.
 

Joptionpane

Aktives Mitglied
hmm bei mir siehts jetzt so aus, würde des beim online stellen ohne Probleme funktionieren mit Mitgliedern?(rein theoretisch jetzt)


Java:
public class ConnectionFactory {

	private static Connection con = null;
	
    public static Connection createConnection() {
     	
    	if(con == null){
        	 	
        	String localUrl = "jdbc:mysql://localhost:3306/";
        	String Url = localUrl;
        	String db = "dab"; 
            String user = "root"; 
            String pw = "";
            	
    	    Connection con = null;
            try {
              
                con = DriverManager.getConnection(Url + db, user, pw);
                con.setAutoCommit(false);

            } catch (Exception e) {
                System.out.println(e.getMessage());
                e.printStackTrace();
                System.out.println("Connection Error");
            }

            return con;   		
    	}
    	else return con;

    }


}
 

utnovetur

Mitglied
Hallo,

dir ist klar, dass du zwei Variablen mit Namen con hast - ein static member (das immer null ist) und eine lokale Variable.
Bei jedem Aufruf erzeugst du also eine neue Connection, die du dann hoffentlich auch schließt.
 

Joptionpane

Aktives Mitglied
Hallo,

dir ist klar, dass du zwei Variablen mit Namen con hast - ein static member (das immer null ist) und eine lokale Variable.
Bei jedem Aufruf erzeugst du also eine neue Connection, die du dann hoffentlich auch schließt.



mein fehler, das war eigentlich kommentiert gewesen, hier der richtige:

Java:
public class ConnectionFactory {
 
    private static Connection con = null;
    
    public static Connection createConnection() {
        
        if(con == null){
                
            String localUrl = "jdbc:mysql://localhost:3306/";
            String Url = localUrl;
            String db = "dab"; 
            String user = "root"; 
            String pw = "";
                
            // Connection con = null;
            try {
              
                con = DriverManager.getConnection(Url + db, user, pw);
                con.setAutoCommit(false);
 
            } catch (Exception e) {
                System.out.println(e.getMessage());
                e.printStackTrace();
                System.out.println("Connection Error");
            }
 
            return con;         
        }
        else return con;
 
    }
 
}
 
S

Spacerat

Gast
Das ist genau das, was ich meinte, was nicht geht. Du machst hier aus den Verbindungen Singletons. Man kann Verbindungen zwar permanent offen halten, aber was ist, wenn eine solche dann mal ungewollt unterbrochen wird? Du müsstest dann die komplette Anwendung neu starten.
Ausserdem instanziert man Singletons synchronisiert, damit nicht mehrere Threads gleichzeitig verschiedene Objekte erzeugen können.
 

Joptionpane

Aktives Mitglied
Das ist genau das, was ich meinte, was nicht geht. Du machst hier aus den Verbindungen Singletons. Man kann Verbindungen zwar permanent offen halten, aber was ist, wenn eine solche dann mal ungewollt unterbrochen wird? Du müsstest dann die komplette Anwendung neu starten.
Ausserdem instanziert man Singletons synchronisiert, damit nicht mehrere Threads gleichzeitig verschiedene Objekte erzeugen können.


Hm ja hab darüber auch einiges im Internet gelesen, dass man es synchronisieren soll, eben damit nicht mehrere Threads gleichzeitig versch. Objekte erzeugen sollen/können. Jedoch dacht ich mir, dass dies Irrelevant ist für dieses Projekt, da es imho nicht möglich ist, dass die Verbindung unterbrochen wird(durch was auch), da dies ja alles Offline hier geschieht.
Hab jetzt halt am Montag die Präsentation über dieses Projekt wo ich ca. 7-8 Minuten erzählen muss wie ich JDBC via Singleton implementiert habe, will jetzt durch diese Fragerei hier, mögliche Fragen vom Prüfer sicher entgegenwirken.
Hab jetzt als Begründung vor zu erläutern, dass ich den Singleton Pattern drin habe, da alles Offline geschieht und nur wir die Administratoren auf die Datenbank zugriff haben, womit Multi-Threading eigtl. ausgeschlossen ist. Dennoch siehts für mich schwer aus, 7-8 Minuten über solch ein kleinen Code zu reden^^
 
S

Spacerat

Gast
Multithreading ist normalerweise niemals ausgeschlossen. Deswegen solltest du es evtl. so begründen, dass es für das Projekt so genügt und weitere Absicherungen gegen Verbindungsabbruch oder Mehrfachinstanzierung den Zeitrahmen gesprengt hätten. Die 7-8 Minuten bekämst ja evtl. damit voll, über diese Problematiken zu reden. Dann vergisst der Prüfer evtl. seine diesbezüglichen Fragen.
 

turtle

Top Contributor
Singleton Pattern drin habe, da alles Offline geschieht und nur wir die Administratoren auf die Datenbank zugriff haben, womit Multi-Threading eigtl. ausgeschlossen ist.

Diesen Zusammenhang würde ich NICHT erwähnen. Das Eine (offline) hat nichts mit der Technik Singleton zu tun.

Es kann ja passieren, dass sich zwei Administratoren auch offline bei deinem Programm anmelden, oder?

Aber die Verbindung zur DB sollte es nur einmal geben, da ja das was Admin1 macht auch von Admin2 gesehen werden soll. Daher sind hier auch konkurierende Zugriffe möglich und sinnvoll. Wie schon richtig beschrieben wurde, werden Verbindungen zu einer DB üblicherweise gepoolt und sind nur kurz offen und werden danach an den Pool zurückgegeben. Danach wird eine weitere Aktion, gleicher oder anderer Benutzer, wieder eine Connection vom Pool anfordern, etwas tun und danach wieder an den Pool geben.

Also müssen die Aktionen, die auf der DB agieren, synchronisiert werden, damit nicht ein anderer Thread da irgendwie reinfunkt.

Wenn ich mir das so überlege, würde ich das Singleton-Pattern rausnehmen und stattdessen einen static-Intitialisier schreiben, der den Pool instanziert. Dieser wird nur einmal aufegrufen und zwar wenn die Klasse von der JVM geladen wird.

Alle anderen Methoden arbeiten dann mit dem Pool. Damit gehst Du jede Diskussion aus dem Weg, die irgendwie mit der Synchonisation eines Singleton in Multi-threaded Umgebungen zu tun hat. Und das ist nicht ohne, denn die üblichen Implementierungen eines Singleton, die man so findet, sind nicht threadsafe!
 
J

JohannisderKaeufer

Gast
Das Singleton, wie es hier implementiert wurde, hat noch einen weiteren Schwachpunkt.


Wie soll das ganze getestet werden?

"dab" ist deine Produktionsdatenbank, da sind normalerweise "wertvolle" Daten drin.

Wenn man testet, sofern man testet, möchte man eine extra Datenbank haben um nichts böses mit seinen "wertvollen" anzustellen, was man später bitterböse bereut.


Dependency Injection ist hier eine mögliche Lösung. Damit kann man sich an den Stellen, an denen man eine Connection braucht eine Connection liefern lassen. Und in Test-Szenarien läßt man sich eben eine Connection zu einer Testdatenbank liefern. DI Provider wie Guice, Spring oder CDI können das IMHO ganz gut.

Bei einem selbstimplementierten Singleton verbaut man sich diesen weg, da dort die Connections aktiv geholt werden und somit dann auf die Produktivdatenbank zugegriffen wird.
 

Joptionpane

Aktives Mitglied
Wie gesagt, es ging ja nur um ein Projekt für eine Vorlesung/Veranstaltung. Jetzt ist die Prüfung vorbei und alles lief gut, wurde eigtl. garnicht auf das Thema eingegangen. Den Professor hat es viel mehr interessiert, was wir in PHP programmiert haben von daher alles easy :)

Danke an alle für die Hilfe.

Closed
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
ruutaiokwu jdbc connection als singleton Datenbankprogrammierung 11
B SQLite + jdbc + IntelliJ-Consumer = "No suitable driver found..." Datenbankprogrammierung 15
J PC-Start Problem JDBC Connection Datenbankprogrammierung 10
N JDBC SQLITE und Cascading Datenbankprogrammierung 2
D Asynchrone Aufrufe mit jdbc Datenbankprogrammierung 5
Edin JDBC Hilfe Datenbankprogrammierung 2
H JDBC Tabellen ausgeben Datenbankprogrammierung 8
Husamoli345 JSF-JDBC Verbindung Crud Datenbankprogrammierung 15
G MySQL JDBC Metadaten auslesen aus .accdb -> Primärschlüssel manchmal erkannt manchmal nicht Datenbankprogrammierung 3
N Java, sql, jar, JDBC-Treiber in Classpath Datenbankprogrammierung 8
O Create Table per JDBC Fehler: ORA-00922 Datenbankprogrammierung 4
J JDBC anschaulich präsentieren Datenbankprogrammierung 2
Thallius MySQL JDBC auf Linux Server zu mySQL DB auf anderem Linux Server wirft Access denied Datenbankprogrammierung 5
ralfb1105 Oracle JDBC Debugging Datenbankprogrammierung 8
Z [JDBC][MYSQL] Access denied Datenbankprogrammierung 7
Thallius MySQL jdbc schließt Verbindung nach vielen Request von selber Datenbankprogrammierung 8
B MySQL JDBC Kommentarfilter Datenbankprogrammierung 4
Aruetiise MySQL Name JDBC Drive finden Datenbankprogrammierung 4
E Sqlite-jdbc Mitliefern Datenbankprogrammierung 4
R jdbc-Zugriff Nicht erlaubt ? Datenbankprogrammierung 16
S probleme mit dem jdbc treiber Datenbankprogrammierung 1
Thallius MySQL Merkwürdiges JDBC Verhalten bei VPN Verbindung. Datenbankprogrammierung 7
O JDBC Daten in zwei Tabellen mit zwei foreach-Schleifen einfügen (insert into) Datenbankprogrammierung 1
F MySQL JDBC Problem Datenbankprogrammierung 5
C JDBC und SQLite Datenbank Datenbankprogrammierung 8
looparda SQLite Active JDBC Abstraktion Datenbankprogrammierung 2
J JDBC SQL Statement mit Parameter Datenbankprogrammierung 7
S JDBC PreparedStatement durchiterieren Datenbankprogrammierung 6
J RESTServie + JDBC + No suitable driver found for jdbc Datenbankprogrammierung 4
KaffeeFan JDBC/ODBC-Bridge entfernt Datenbankprogrammierung 4
S sun.jdbc.odbc.JdbcOdbcDriver wird nicht gefunden Datenbankprogrammierung 2
J Fehlende DatenbankView nach einbeziehen von JDBC Datenbankprogrammierung 3
A Mit JDBC auf postgreSQL Datenbank zugreifen Datenbankprogrammierung 5
C PostgreSQL JDBC + PostgreSQL: getLong liefert 0 statt NULL Datenbankprogrammierung 2
flenst111 SQL-Statement Wie konfiguriert man JDBC-Connect.richtig, damit es bei riesigen Tabs keinen Speicherüberlauf gibt? Datenbankprogrammierung 1
M JDBC Tabellen mit Boolean Spalten können nicht erstellt werden. DB Updaten - wie? Datenbankprogrammierung 6
S JDBC mit Postgres DB connecten Datenbankprogrammierung 3
A Eine MySQL Zeile mit JDBC löschen Datenbankprogrammierung 5
D JDBC - Verständnisfrage Datenbankprogrammierung 2
C Tabelle erstellen mit Apache JDBC-Util Datenbankprogrammierung 1
L Conversion-Error bei JDBC Date Literals Datenbankprogrammierung 3
X MySQL DB-verbindung ohne JDBC/ODBC Datenbankprogrammierung 1
F sun.jdbc.odbc.jdbcodbcdriver wird nicht gefuden Datenbankprogrammierung 3
J Keine Verbindung zu MSSQL DB mit JDBC Datenbankprogrammierung 3
U JDBC prepaird Statements Datenbankprogrammierung 4
B MySQL JDBC Zugriff auf entfernt Datenbank, fehlende Rechte Datenbankprogrammierung 2
Q MySQL JDBC-Treiber Problem Datenbankprogrammierung 2
R Transaktionen von mehreren Anwendungen aus - JDBC Datenbankprogrammierung 3
N MySQL com.microsoft.sqlserver.jdbc.SQLServerException: Die Verbindung wurde geschlossen. Datenbankprogrammierung 1
N JDBC: rollback() bei Exception geht nicht!? Datenbankprogrammierung 1
C Dateipfad des jdbc Treibers Datenbankprogrammierung 2
G JDBC Connect nur über SID fehlerfrei möglich Datenbankprogrammierung 2
R Oracle jdbc Zugriff auf Oracle Datenbankprogrammierung 2
T JDBC Fehler Datenbankprogrammierung 2
Z PostgreSQL JDBC mit Postgresql Datenbankprogrammierung 2
B No suitable driver found for jdbc:oracle:thin:@$HOST:$PORT:$SID Datenbankprogrammierung 7
K JDBC via Netzwerk Datenbankprogrammierung 4
B JDBC Connection Fehler Datenbankprogrammierung 8
K JDBC- In Java "stored procedure" erstellen für DB2,OracleSql ... Datenbankprogrammierung 3
J JDBC in Library|"Treiber konnte nicht geladen werden"" Datenbankprogrammierung 2
B JDBC-Connection: Data source name too long Datenbankprogrammierung 3
D JDBC insert mit select abfrage Datenbankprogrammierung 5
A JDBC Prepared Statement Autoincrement Datenbankprogrammierung 3
H JDBC prüfen ob Table existiert Datenbankprogrammierung 3
crashfinger jdbc-connection mit jre7 funktioniert nicht Datenbankprogrammierung 5
0 JDBC Oracle Verbindungsaufbau Datenbankprogrammierung 6
Q Oracle Linux: ClassNotFoundException: oracle.jdbc.driver.OracleDriver Datenbankprogrammierung 6
B JDBC MySQL Statement Datenbankprogrammierung 3
F Oracle Oracle JDBC Anbindung unter Glassfish 3.1.2 Datenbankprogrammierung 3
V PostgreSQL JDBC Treiber fehlt Datenbankprogrammierung 6
Y JDBC - Datenbankabfrage Webserver Datenbankprogrammierung 4
C JDBC Datenbank funktioniert nicht Datenbankprogrammierung 7
C JDBC , JDO oder JPA Datenbankprogrammierung 17
J MySQL Datenbank konfigurieren, JDBC, MySQL oder Hibernate Datenbankprogrammierung 2
P JDBC Verbindung zur DB klappt nicht Datenbankprogrammierung 6
J Java - JDBC Verbindung zur Datenbank nicht möglich Datenbankprogrammierung 10
K JDBC Buch kaufen? Datenbankprogrammierung 3
K Hibernate vs. JDBC Datenbankprogrammierung 4
K JDBC Driver not found Datenbankprogrammierung 10
GianaSisters Per JDBC auf Microsoft SQL 2005 Datenbankprogrammierung 24
S ich brauche tipps für JDBC Datenbankprogrammierung 4
Paristick MSSQL - JDBC Exception beim Registrieren Datenbankprogrammierung 5
S Applet stucks at SQL Connection (jTDS JDBC) Datenbankprogrammierung 15
R MySQL Voraussetzungen für eine erfolgreiche Datenbankanbindung mittels JDBC Datenbankprogrammierung 2
c_sidi90 JDBC Oracle Connection schlägt fehl Datenbankprogrammierung 2
J jdbc-dataSource in Klassen nutzen Datenbankprogrammierung 2
H Rechnen in Datenbanken - JDBC Mittel der Wahl? Datenbankprogrammierung 32
K MySQL JDBC - Access Datenbank - unbekannter TabellenName Datenbankprogrammierung 4
D JDBC Fehler beim laden der nativen Bibliothek db2jcct2 Datenbankprogrammierung 9
J MySQL Verbindung über JDBC scheitert immer Datenbankprogrammierung 2
I Master/Detail Tabellen mit JDBC und Swing Datenbankprogrammierung 10
S MSSQL JDBC "Driver class not found" Datenbankprogrammierung 9
E Datenbankverbindung mit Oracle JDBC und Eclipse Plugin Quantum db Datenbankprogrammierung 2
J MySQL Löschen von Rows mit JDBC Datenbankprogrammierung 9
G JDBC Exception Datenbankprogrammierung 3
Screen Ich suche eine SQLDatenbank ohne JDBC-Treiber Datenbankprogrammierung 12
F Fehlerhandling bei JDBC Datenbankprogrammierung 9
T JDBC und Arrays Datenbankprogrammierung 7
X Oracle JDBC und Joins? Datenbankprogrammierung 7
A No suitable driver found for jdbc:microsoft:sqlserver... Datenbankprogrammierung 9

Ähnliche Java Themen

Neue Themen


Oben