Gemeinsame Nutzung der DB-Verbindungen über Objekte mit Klassenmethoden in Ruby?
-
12-09-2019 - |
Frage
ich ein Ruby-Skript schreibe als Postfix SMTP-Richtlinie Delegation verwendet werden. Das Skript muss eine Tokyo Tyrant Datenbank zuzugreifen. Ich verwende eventmachine Pflege von Netzwerkverbindungen zu nehmen. Eventmachine braucht eine eventmachine :: Connection-Klasse, die von der Verarbeitungsschleife eventmachine instanziiert wird, wenn eine neue Verbindung erstellt wird. so für jede Verbindung einer Klasse instanziiert und zerstört.
Ich bin eine Verbindung zu Tokyo Tyrant vom post_init der eventmachine :: Verbindung zu schaffen (dh direkt nach der Verbindung ist Setup) und reißen es nach unten, nachdem Verbindung beendet wird.
Meine Frage ist, ob dies der richtige Weg ist, um eine Verbindung zu db? dh Herstellung einer Verbindung jeder yime ich es brauche und reißen es nach unten, nachdem ich fertig bin? Wäre es nicht besser sein, wenn eine Verbindung zu DB (wenn das Programm gestartet wird) reißt es während des Programmherunterfahrens nach unten? Wenn dem so ist, wie soll ich das Code?
Mein Code ist:
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 "*" }
}
mit Grüßen,
raj
Lösung
Überraschend gibt es keine Antworten auf diese Frage.
Was Sie wahrscheinlich brauchen, ist eine Verbindung Pool, wo Sie holen können, verwenden und -rücklauf wie sie benötigt werden.
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