2011-01-05 6 views
8

¿Cuál es el uso de la declaración de socket en config/database.yml?¿Para qué es la declaración de socket en Ruby on Rails database.yml?

código Ejemplo: trabaja

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

Mi aplicación, wether esta línea se comenta o no. Entonces, ¿para qué es? ¿Qué razones puedo tener para dejarlo, comentarlo o cambiar su valor?

Respuesta

12

Cuando dos programas quieren hablar el uno al otro por la red, un programa podría abrir una conexión TCP (un "socket") con el otro. El primer programa necesita saber la dirección IP de la segunda computadora y el puerto en el que el programa está escuchando.

En Linux, cuando dos programas en la misma computadora desean comunicarse, aún pueden abrir una conexión TCP. Pero también pueden abrir una conexión a través de un "archivo socket". Linux hace que la API de archivos de socket sea bastante similar a la API de TCP, por lo que no es gran cosa actualizar un programa que ya se comunica a través de la red a través de TCP para permitir la comunicación a través de archivos de socket también. Los archivos de socket son más rápidos que TCP, pero solo funcionan cuando ambos programas están en la misma computadora.

+1

En mi aplicación Rails 4, la configuración 'socket' parece ser ignorado En cambio, tuve que establecer 'host:/ruta/a/socket /' para que al menos 'rake db: migrate' funcione. – user569825

5

MySQL tiene dos métodos para comunicarse con él en sistemas unix-ish, tcp/ip y sockets de dominio. Al especificar el socket Rails, o más bien el controlador de la base de datos, usará el socket en lugar de una conexión de red. Puede ser más rápido usar el socket pero YMMV.

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

+0

como un asidero adicional: el socket solo funcionará si su DB se ejecuta en la misma caja que el servidor de aplicaciones, por lo que este mecanismo tiende a no ser adecuado para despliegues agrupados – DrewM

0

Perdí una tarde entera debido a un socket especificado en mi base de datos.yml - las especificaciones de la base de datos para el entorno de prueba simplemente no se analizaron. Por lo tanto, si tiene un problema con la base de datos de prueba que no está accesible, aunque todo parece ir bien, intente eliminar la especificación del socket.