Compartir las conexiones de base de datos a través de los objetos que utilizan métodos de clase en Ruby?

StackOverflow https://stackoverflow.com/questions/1253620

Pregunta

Estoy escribiendo un guión de rubí para ser utilizado como Postfix SMTP delegación política de acceso. El script necesita tener acceso a una base de datos Tokio tirano. Estoy usando EventMachine para cuidar de las conexiones de red. EventMachine necesita una clase EventMachine :: conexión que se crea una instancia de bucle de procesamiento de EventMachine cada vez que se crea una nueva conexión. por lo que para cada conexión se crea una instancia de una clase y destruido.

Estoy creando una conexión a Tokio Tirano de la post_init del EventMachine :: conexión (es decir, justo después de la conexión es de configuración) y rasgando hacia abajo después de que se termina la conexión.

Mi pregunta es si esta es la forma correcta de conectar a db? es decir, hacer una conexión cada yime lo necesito y rasgando hacia abajo después de que haya terminado? No sería mejor para conectarse a DB una vez (cuando se inicia el programa) derribarla durante el apagado del programa? Si esto es así, ¿cómo debería codificar eso?

Mi código es:

require 'rubygems'
require 'eventmachine'
require 'rufus/tokyo/tyrant'

class LineCounter < EM::Connection
  ActionAllow = "action=dunno\n\n"

  def post_init
    puts "Received a new connection"
    @tokyo = Rufus::Tokyo::Tyrant.new('server', 1978)
    @data_received = ""
  end

  def receive_data data
    @data_received << data
    @data_received.lines do |line|
      key = line.split('=')[0]
      value = line.split('=')[1]
      @reverse_client_name = value.strip() if key == 'reverse_client_name'
      @client_address = value.strip() if key == 'client_address'
      @tokyo[@client_address] = @reverse_client_name
    end
    puts @client_address, @reverse_client_name
    send_data ActionAllow
  end

  def unbind
    @tokyo.close
  end
end

EventMachine::run {
  host,port = "127.0.0.1", 9997
  EventMachine::start_server host, port, LineCounter
  puts "Now accepting connections on address #{host}, port #{port}..."
  EventMachine::add_periodic_timer( 10 ) { $stderr.write "*" }
}

en lo que respecta,

Raj

¿Fue útil?

Solución

Sorprendente no hay respuestas a esta pregunta.

Lo que probablemente necesita es un conjunto de conexiones, donde se puede recuperar, usar y conexiones de retorno ya que son necesarios.

class ConnectionPool
  def initialize(&block)
    @pool = [ ]
    @generator = block
  end

  def fetch
    @pool.shift or @generator and @generator.call
  end

  def release(handle)
    @pool.push(handle)
  end

  def use
    if (block_given?)
      handle = fetch

      yield(handle) 

      release(handle)
    end
  end
end

# Declare a pool with an appropriate connection generator
tokyo_pool = ConnectionPool.new do
  Rufus::Tokyo::Tyrant.new('server', 1978)
end

# Fetch/Release cycle
tokyo = tokyo_pool.fetch
tokyo[@client_address] = @reverse_client_name
tokyo_pool.release(tokyo)

# Simple block-method for use
tokyo_pool.use do |tokyo|
  tokyo[@client_address] = @reverse_client_name
end
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top