2011-01-05 5 views
8

Was ist die Verwendung der Socket-Deklaration in config/database.yml?Was ist die Socket-Deklaration für in Ruby on Rails database.yml?

Beispielcode:

staging: 
    adapter: mysql 
    encoding: utf8 
    database: (database) 
    pool: 5 
    username: (user) 
    password: (pass) 
    socket: /tmp/mysql.sock  # <--------- this line 

Meine App funktioniert, ob diese Zeile kommentiert wird oder nicht. Also wofür ist es? Welche Gründe kann ich haben, um es zu verlassen, es zu kommentieren oder seinen Wert zu ändern?

Antwort

12

Wenn zwei Programme miteinander reden wollen über das Netzwerk, ein Programm könnte eine TCP-Verbindung (eine „Buchse“) mit der anderen öffnen. Das erste Programm muss die IP-Adresse des zweiten Computers und den Port kennen, auf dem das Programm zuhört.

Wenn unter Linux zwei Programme auf demselben Computer miteinander kommunizieren möchten, können sie dennoch eine TCP-Verbindung herstellen. Sie können aber auch eine Verbindung über eine "Socket-Datei" herstellen. Linux macht die Socket-Datei-API der TCP-API sehr ähnlich. Es ist also keine große Sache, ein Programm zu aktualisieren, das bereits über TCP über das Netzwerk kommuniziert, um auch die Kommunikation über Socket-Dateien zu unterstützen. Socket-Dateien sind schneller als TCP, funktionieren jedoch nur, wenn sich beide Programme auf demselben Computer befinden.

+1

In meiner Rails 4 App scheinen die 'Socket' Einstellungen ignoriert werden. Stattdessen musste ich 'host:/path/to/socket /' setzen, damit mindestens 'rake db: migrate' funktioniert. – user569825

5

MySQL hat zwei Methoden zur Kommunikation mit ihm auf Unix-ish-Systemen, TCP/IP und Domain-Sockets. Durch Angeben des Sockets Rails oder besser der Datenbanktreiber verwendet den Socket anstelle einer Netzwerkverbindung. Es kann schneller sein, den Socket aber YMMV zu verwenden.

http://dev.mysql.com/doc/refman/5.5/en/connecting.html

+0

als zusätzlicher side - socket funktioniert nur, wenn Ihre DB auf derselben Box wie der Anwendungsserver läuft - daher ist dieser Mechanismus für geclusterte Bereitstellungen nicht geeignet – DrewM

0

Ich verschwendete einen ganzen Nachmittag wegen eines Sockets, der in meiner Datenbank.yml angegeben wurde - die Datenbankspezifikationen für die Testumgebung wurden einfach nicht geparst. Wenn Sie also ein Problem damit haben, dass Ihre Testdatenbank nicht erreichbar ist, obwohl alles in Ordnung zu sein scheint, entfernen Sie die Socket-Spezifikation.