Zum Inhalt springen

Singleton-Pattern (MSSQL, MySQL, Oracle)


Empfohlene Beiträge

Geschrieben (bearbeitet)

Singleton-Klasse für 3 Datenbankobjekte der unterschiedlichen Technologien

Hallo,

habe hier mal rumgespielt und wollte ein Singleton anwenden, welches bei der Datenbankverbindung flexibel ist. Also mehrere Datenbanken bedienen kann.

Wer lust hat, kann ja mal drüber schauen.

Wenn ein Fehler drin ist, bitte Bescheid sagen!

Gruß

class DatabaseConnection {


 private static $instance = array();


 public static function getInstance($database){

     //Wenn das Objekt schon vorhanden ist, wird es zurück gegeben

     if(isset(self::$instance[$database])){

             return self::$instance[$database];

     }

     //Datanbankverbindung für mysql aufbauen:

     if($database == 'mysql'){

      try {

        self::$instance[$database] = new mysqli('localhost', 'root', '', 'lerndvd');

          echo "Verbindung hergestellt! <br />";

          return self::$instance[$database];

       }catch(Exception $e) {

            echo "Fehler: " . HTML_SPECIALCHARS($e->getMessage());

       }

         //Datanbankverbindung für microsoft-sql aufbauen:

      }else if($database == 'mssql'){

         try {                      

self::$instance[$database] = mssql_connect('Server\\SQLEXPRESS', 'sa', '*') or die();

            mssql_select_db('test');

            echo "Verbindung mssql hergestellt! <br />";

            return self::$instance[$database];

         }catch(Exception $e) {

             echo "Fehler: " . HTML_SPECIALCHARS($e->getMessage());

      }

     //Datanbankverbindung für oracle aufbauen:

     }else if($database == 'oracle'){

            try {

                //...Code Oracle

                return self::$instance[$database];

            }catch(Exception $e) {

                echo "Fehler: " . HTML_SPECIALCHARS($e->getMessage());

            }

        }

    }


    private function  __construct() {


    }


    private function  __clone() {


    }

}

Bearbeitet von alexC++
Geschrieben

Hallo,

also ich bin alles andere als sehr OOP erfahren, aber wie ich den Code so sehe (der besser in PHP Code tags wegen der lesbarkeit aufgehoben wäre) kommunizierst du da nicht mit mehreren Datenbanken sondern mit mehreren DBMS (Datenbankmanagementsystemen).

So wie ich das sehe bekommst du da ein Problem wenn du von ein und dem selben DBMS also Beispielsweise Mysql mit mehreren Datenbanken kommunizieren willst. Denn der Nachteil bei dem Singletonpattern ist, das du nur eine Instanz auf ein Objekt bilden kannst.

Ich denke in dem Fall wäre das registry Pattern besser angebracht, ahbe das selber noch nicht gemacht aber darüber gelesen.

Mfg lit-web

Geschrieben

viel schlimmer find ich jetzt, das ich als anwender dieser klasse verschiedene dinge geliefert bekomme wenn ich DatabaseConnection::getInstance(); aufrufe.

mal ist es ein objekt mal nur eine verbindungsresource.

Geschrieben (bearbeitet)
So wie ich das sehe bekommst du da ein Problem wenn du von ein und dem selben DBMS also Beispielsweise Mysql mit mehreren Datenbanken kommunizieren willst.

ich habe hier mysql, mssql und oracle als dbms und ich bilde jeweils für diese ein objekt (bzw. eine verbindung -> _n4p_).

Denn der Nachteil bei dem Singletonpattern ist, das du nur eine Instanz auf ein Objekt bilden kannst.

das ist ja eben der sinn und zweck des singleton-patterns. ich hätte hier nur jeweils ein objekt für jede datenbank.

@_n4p_

Für jeden datenbanktyp eine extra klasse wäre glaube ich am sinnvollsten.

haben mysqli_connect und mysql_connect den gleichen rückgabetyp?

dann könnte man es auch so machen.

Gruß

Bearbeitet von alexC++
Geschrieben

In dem Fall wie der code aussieht hast du, wie ich schon schrieb nicht wirklich ein Objekt auf eine Datenbank in dem Sinne, sondern du handelst da 3 oder 4 DBMS ab DB != DBMS.

Um mit den Datenbanken selber zu mommunizieren musst du erst mal eine Verbindung mit einem DBMS aufbauen, sagen wir mal Mysql.

So und wenn die Verbindung steht, kann man erst mit einer Datenbank aus dem DBMS kommunizieren. Und da ist das Singletonpattern keine gute Wahl, was wenn ein System mit Mysql arbeitet und da aber mit 3 Datenbanken? Und schon hast du ein Problem, dann kannst du nicht mit allen 3 Datenbanken kommunizieren, das heist dafür solltest du auf Registry Pattern umsteigen, so hast du immer noch die Möglichkeit mit mehreren Datenbanken aus einem DBMS zu kommunizieren.

Weiterer Problemfall der auftreten kann, wo ich ebenfalls das SingleTon Pattern als fehl am Platz finde, es gibt auch Anwendungen die mal mit mehreren DBMS arbeiten, sprich mal mit Mysql und Oracle zusammen, gibt einige Gründe warum man das machen könnte, dann hast du auch da wieder das Problem das du nur mit einem DBMS arbeiten kannst, also auch da würde ich auf das Registry Pattern umsteigen, dann kannst du mehrere Instanzen auf das DBMS Objekt bilden und bist somit flexibel, das du eben mit Mysql und Oracle arbeiten kannst.

Mfg lit-web

Geschrieben (bearbeitet)

verschiedene Nachteile:

1. Wie angesprochen ist das Singleton hier nicht so zu empfehlen, denn du könntest mehrere, gleiche Datenbanken ansprechen wollen / müssen.

2. du hast die Konfiguration direkt im Code, was bedeutet du "kannst" zu jeder Datenbank nur eine Verbindung aufbauen.

3. das SQL der jeweiligen Datenbanken unterscheidet sich (gravierend genug, wie ich kürzlich feststellen musste). Es ist zwar ein Anfang, aber wirklich hilfreich wird es erst wenn du (fast) alle Kommandos an alle DBMS schicken kannst, ohne speziell dafür zu programmieren (insert, update, replace, select, ggf. subselects und joins). du gibst hier ja auch die Resource-pointer zurück. Die sind an bestimmte Befehle gebunden ... sonst läuft nichts.

das nennt sich dann Query-Object-Model oder Database-Abstraction-Layer

also was genau möchtest du von uns, entwickelst du das weiter und brauchst ideen oder wo liegt die Frage ?

Bearbeitet von Aiun

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...