2014-02-28 5 views
5

Ich habe eine Frage zum Umgang mit mehreren DB-Verbindungen in Laravel 4.1. sagen, dass ich ein DB-Host mit 3 DBs haben auf diesem HostZu viele Verbindungen w/Laravel 4 und MySQL

zB:

'mysql' => array(
     'driver' => 'mysql', 
     'host'  => 'localhost', 
     'database' => 'DB_1', 
     'username' => $_ENV['MYSQL_USER'], 
     'password' => $_ENV['MYSQL_PASS'], 
     'charset' => 'utf8', 
     'collation' => 'utf8_unicode_ci', 
     'prefix' => '', 
    ), 

    'mysql2' => array(
     'driver' => 'mysql', 
     'host'  => 'localhost', 
     'database' => 'DB_2', 
     'username' => $_ENV['MYSQL_USER'], 
     'password' => $_ENV['MYSQL_PASS'], 
     'charset' => 'utf8', 
     'collation' => 'utf8_unicode_ci', 
     'prefix' => '', 
    ), 

    'mysql3' => array(
     'driver' => 'mysql', 
     'host'  => 'localhost', 
     'database' => 'DB_3', 
     'username' => $_ENV['MYSQL_USER'], 
     'password' => $_ENV['MYSQL_PASS'], 
     'charset' => 'utf8', 
     'collation' => 'utf8_unicode_ci', 
     'prefix' => '', 
    ), 

Sollte ich auf diese DBs machen drei unterschiedliche Verbindungen sein?

Oder sollte ich einfach eine Verbindung haben und in jedem Modell den Tabellennamen etwas angeben:

public $table = "DB_2.table_name"; 

Der Grund, warum ich frage, ist, dass ich habe bemerkt, dass ich es einfacher ist, die zu erschöpfen Datenbankverbindungen, da es eine neue DB-Verbindung erstellt, wann immer es Verbindung zu einer anderen Datenbank benötigt.

Ich weiß, dass beide funktionieren werden, aber ich bin daran interessiert, was als "Best Practice" in einer solchen Situation angesehen wird.

Vielen Dank im Voraus für die Rückmeldung.

Prost.

Antwort

1

Angeben an die Tabelle, nicht die DB-Implementierung.

Ich bin kein großer Fan der "Funktion", die Query DB Query auf MySQL zwischen DBs auf dem gleichen Server ermöglicht. Das ist es, was die erwähnte Sache erlauben würde.

  • Wenn Sie den Namen Ihrer Datenbank ändern, müssen Sie Ihre Tabellennamen in Ihrem Code umgestalten.
  • Wenn Sie eine Testdb wie table_name_test erstellen, um Ihren Code oder eine db-Änderung zu testen, müssen Sie alle Ihre Tabellen in Ihrem Code ändern, jedes Mal wenn Sie zwischen db's und der Konfigurationsdatei wechseln.
  • Was ist, wenn Sie auf eine differnt DB-Technologie ohne DB-Namen bewegen (ein Db pro Server/Fuile, werden Sie Ihre Tabellennamen Eigenschaften in jeder Klasse Refactoring müssen)
  • Es führt die dunkle unten, verlockend noch vile Weg von Quer-DB-Abfragen wie select * from db1.foo f Join db2.bar b on b.id = f.id;. Herzlichen Glückwunsch, Sie haben gerade Ihre 2 dbs in tatsächlich eine große db, die möglicherweise nicht außerhalb von MySQL ausgeführt
  • Auch wenn Sie drei Verbindungen angeben, sind Sie wahrscheinlich keine Verbindung und alle drei auf einmal. .. Ich hoffe. Wenn Sie alle 3 Verbindung pro Anfrage an Sie Laravel App/Site speichern 2 Verbindungen verwenden, ist wahrscheinlich, Mikro-Optimierung.

    +0

    Ja, ich denke du hast absolut recht. Letztendlich müssen wir unser Datenmodell so umgestalten, dass wir nie mehrere DB-Verbindungen für einen Arbeitsablauf erstellen müssen - insbesondere bei einer einzigen Abfrage. Bis dahin muss ich etwas tun, das das System vor Überlastung bewahrt. Das Problem, das ich habe, ist, wenn wir viele gleichzeitige Anfragen verarbeitet haben. Dies führt zu maximal 3 Verbindungen pro Anfrage - was die Leistung bei hohem Datenverkehr beeinträchtigen kann. – Gimli

    +0

    @ Gimli gibt es keine Möglichkeit in PDO (vorausgesetzt, Sie verwenden, dass in Laravel) Db's auf der gleichen Verbindung zu wechseln. Sobald ein DSN an einen Konstruktor übergeben wurde, ist es gesetzt. Der DSN sollte die Datenbank angegeben haben. Wenn Sie versuchen, den Datenbanknamen in der $ -Tabelle zu verwenden, könnten Sie Anfragen erhalten, die wie folgt aussehen: 'select * from DB1.DB2.footable'. – Ray

    +0

    @ Gimili natürlich, mit manuell erstellten Abfragen können Sie dies tun, wenn Sie nicht ein Orm oder DQL verwenden. – Ray

    0

    Dieser Code machte den Trick für mich, wenn ich brauchte.

    Config::set('database.default', 'database_name'); 
    

    In Ihrem Fall, ersetzen Sie die database_name mit denen, die Sie benötigen. Ich rufe es jedes Mal im Controller an, wenn ich sehe, dass ich den Wechsel machen muss. Vor einer Abfrage, zum Beispiel.

    Ich weiß nicht, ob der beste Weg ist immer, es zu tun, aber es funktioniert für mich und ich dachte, es sich wert! = D

    +1

    Während dies funktionieren kann, bin ich nicht sicher, ob das Herstellen von Datenbankverbindungen in einem Controller eine gute Vorgehensweise ist. Allerdings bin ich mir nicht sicher, ob das Öffnen und Schließen von Verbindungen im laufenden Betrieb auch die performanteste Sache wäre. Vor allem, wenn Abfragen an mehrere Datenbanken durchgeführt werden müssen. Dann benötigen Sie im schlimmsten Fall noch 3 separate DB-Verbindungen. – Gimli