2009-08-10 10 views
3

J'écris un script ruby ​​à utiliser comme délégation de politique d'accès SMTP de Postfix. Le script doit accéder à une base de données Tokyo Tyrant. J'utilise EventMachine pour prendre soin des connexions réseau. EventMachine a besoin d'une classe EventMachine :: Connection qui est instanciée par la boucle de traitement de EventMachine chaque fois qu'une nouvelle connexion est créée. Ainsi, pour chaque connexion, une classe est instanciée et détruite.Partage de connexions DB à travers des objets en utilisant des méthodes de classe dans ruby?

Je crée une connexion à Tokyo Tyrant à partir de l'attribut post_init de EventMachine :: Connection (c'est-à-dire juste après la configuration de la connexion) et je l'arrête une fois la connexion terminée.

Ma question est de savoir si c'est la bonne façon de se connecter à db? c'est-à-dire faire une connexion tous les ans j'en ai besoin et je l'arrache après que j'ai fini? Ne serait-il pas préférable de se connecter à la base de données une fois (lorsque le programme est démarré) pour l'arrêter lors de l'arrêt du programme? Si c'est le cas, comment dois-je coder cela?

Mon code est:

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 ce qui concerne,

raj

Répondre

1

Surprenant il n'y a pas de réponse à cette question.

Vous avez probablement besoin d'un pool de connexions dans lequel vous pouvez récupérer, utiliser et renvoyer les connexions si nécessaire.

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 
Questions connexes