Совместное использование соединений с БД между объектами с использованием методов класса в Ruby?

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

Вопрос

Я пишу сценарий Ruby, который будет использоваться в качестве делегирования политики доступа Postfix SMTP.Скрипту необходим доступ к базе данных Tokyo Tyrant.Я использую EventMachine для управления сетевыми подключениями.EventMachine необходим класс EventMachine::Connection, экземпляр которого создается циклом обработки EventMachine при каждом создании нового соединения.поэтому для каждого соединения создается и уничтожается класс.

Я создаю соединение с Tokyo Tyrant из post_init EventMachine::Connection (т.е. сразу после установки соединения) и разрываю его после разрыва соединения.

Мой вопрос: правильный ли это способ подключения к БД?т.е. устанавливать соединение каждый раз, когда оно мне нужно, и разрывать его после того, как я закончу?Не лучше ли один раз подключиться к БД (при запуске программы) и снести ее при завершении работы программы?Если это так, то как мне это закодировать?

Мой код:

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 "*" }
}

С уважением,

радж

Это было полезно?

Решение

Удивительно, что на этот вопрос нет ответа.

Вероятно, вам понадобится пул соединений, в котором вы сможете извлекать, использовать и возвращать соединения по мере необходимости.

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top