Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Singleton-Pattern für Datenbankverbindung

Empfohlene Antworten

Veröffentlicht

Hallo,

habe mal probiert ein Singleton-Pattern für eine Datenbankverbindung zu bauen.

Habe zwar schon mal in Java programmiert, ist aber schon über 2 Jahre her, also bitte Nachsicht mit mir üben ;)

Schauts euch mal an und gibt eure Meinung dazu ab!


public class DatabaseConnection {


	private static Connection instance = getConnection();


	private DatabaseConnection() {}


	public static Connection getInstance() {


             return instance;


        }


	/**

	 * 

	 * @return Connection

	 */

	private static Connection getConnection()  {

		// JDBC-Treiber für die Verbindung

		// zur mySQL-Datenbank laden

		try {

			Class.forName("com.mysql.jdbc.Driver").newInstance();

		} catch (InstantiationException e1) {

			// TODO Auto-generated catch block

			e1.printStackTrace();

		} catch (IllegalAccessException e1) {

			// TODO Auto-generated catch block

			e1.printStackTrace();

		} catch (ClassNotFoundException e1) {

			// TODO Auto-generated catch block

			e1.printStackTrace();

		}


		// Verbindungsoptionen

		String sUser = "root";

		String sPassword = "";

		String sUrl = "jdbc:mysql://localhost:3306/lerndvd";


		// Verbindung aufbauen

		Connection con = null;

		try {

			con = DriverManager.getConnection(sUrl, sUser, sPassword);			

		} catch (SQLException e) {

			// TODO Auto-generated catch block

			e.printStackTrace();

		}

		return con;

	}	

}


Ich wollte die Exceptions eigentlich in den Methoden-Kopf mit "throws" platzieren.

Gibt es da eine gewisse Anzahl die gültig ist?

Er hat nämlich gemeckert.

Gruß

Alex

Das sieht in meinen Augen gut aus. Gemeckert hat der Compiler vielleicht beim Aufruf von getConnection(), weil dort kein try/catch Block ist. An der Anzahl der Exceptions in der throws Deklaration sollte es nicht scheitern.

Schöne Grüße,

Peter

Ich hatte in Multi-Threaded-Umgebungen immer Probleme mit einem einfachen Singleton-Pattern.

Deshalb hab ich das immer mit zwei synchronized gemacht.


	private static Connection instance = null;	

	public static Connection getInstance() {

		synchronized(DatabaseConnection.class) {

			if(instance == null) {

				synchronized(DatabaseConnection.class) {

					if(instance == null){

						instance = getConnection();

					}// 2nd if null

				}// 2nd synchro

			}// 1st if null

		}// 1st synchro

		return instance;

	}

Die Begründung bekomm ich nicht mehr 100%ig zusammen, aber google ist da aussagekräftig.

Schau dir mal den link hier an

Singleton Pattern in Java

da stehen all die probleme drinne.

habe jetzt das objekt beim ersten zugriff auf die klasse durch

die JVM erzeugt. das würde alle bekannten probleme lösen.

auch die bei der synchronisierung.

gruß

Das mit der fehlenden Synchronisierung war auch mein erster Gedanke, bis ich gesehen habe, dass das ja schon ganz am Anfang passiert und nicht erst beim ersten Zugriff auf die Instanz. Ich denke deshalb auch, dass Multithreading hier kein Problem sein sollte.

Peter

Hmm, klingt eigentlich trivial und einleuchtend. Nur ich kann ich nicht mehr erinnern warum ich das nicht so gemacht hab.

Deinen Link hab ich mir mal angeguckt. Nur das vorletzte (problematische) DoubleChecked...-Beispiel hinkt, da nicht 2mal synchronized, sondern nur zweimal if ( null ). Und das war eben zu wenig.

[...]

Deinen Link hab ich mir mal angeguckt. Nur das vorletzte (problematische) DoubleChecked...-Beispiel hinkt, da nicht 2mal synchronized, sondern nur zweimal if ( null ). Und das war eben zu wenig.

Dein Beispiel ist genauso problematisch, Siehe IBM: Double-checked locking and the Singleton pattern

Gruß

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.