Совместное использование дескриптора базы данных - PullRequest
1 голос
/ 03 марта 2012

Мне нужно разделить дескриптор базы данных среди нескольких скриптов Ruby. Я использую гем DBI для подключения к базе данных. Рассмотрим следующий пример

#a.rb
class A
  require 'dbi'

  def connect
    if a database handle is already open return it
    else create a new one and return it
  end
end

#b.rb
class B
  require 'a'
  a = A.new
  dbh = a.connect
  #some database queries here
end

#c.rb
class C
  require 'a'
  a = A.new
  dbh = a.connect #Here the database handle created by class B should be returned 
end

Я понимаю, что переменные экземпляра класса - это путь к достижению указанной цели. Может ли кто-нибудь дать представление об этом?

Имеет ли DBI что-то похожее на Log4r

class A
  require 'log4r'
  Log4r::Logger.new('SO') #create a new instance here
end

class B
  require 'a'
  Log4r::Logger['SO'] # get the existing instance here
end

Большое спасибо.

1 Ответ

2 голосов
/ 15 марта 2012

Далее используется Singleton для управления хэшем дескрипторов DBI.Он создаст новый дескриптор для заданного набора параметров соединения (аргументы, которые можно передать DBI.connect) при первом запросе соединения с этими параметрами.Последующие запросы с такими же параметрами получат уже открытый дескриптор.

# there_can_be_only_one_dbh.rb

require 'dbi'
require 'singleton'

class ThereCanBeOnlyOneDBH
  include Singleton

  DEFAULT_CONNECT_OPTIONS = ['dsn','user','pw']

  def connect( *options )
    options = DEFAULT_CONNECT_OPTIONS unless options and !options.empty?
    @handles ||= {}
    @handles[options.join('|')] ||= DBI.connect( *options )
  end
end

# b.rb
require 'there_can_be_only_one_dbh'

class B
  def initialize( *dbi_connect_options )
    @dbh = ThereCanBeOnlyOneDBH.instance.connect( *dbi_connect_options )
  end

  # methods which issue queries using @dbh
end

# c.rb
require 'there_can_be_only_one_dbh'

class C
  def initialize( *dbi_connect_options )
    @dbh = ThereCanBeOnlyOneDBH.instance.connect( *dbi_connect_options )
  end

  # other methods which issue queries using @dbh
end
...