[Ruby] DBI - jak to poprawnie napisać?

Cześć. Piszę skrypt w Ruby’m, który musi wykonywać wiele operacji na bazie danych i chciałbym, aby robił to bardzo wydajnie i szybko, a w dodatku musi działać bardzo stabilnie. Do tej pory korzystałem z DBI, a funkcja odczytująca rekordy z bazy danych wyglądała następująco:

def select_one(query) data = nil begin dbh = DBI.connect("DBI:Pg:#{@@db_name}:#{@@db_ip}", @@db_user, @@db_password) data = dbh.select_one(query) rescue Exception => e log "SELECT ONE exception: " + e.to_s + ' | ' + query ensure dbh.disconnect if dbh end return data end# select one
Jednak później przerobiłem skrypt tak, że na samym początku ustanawia połączenie, a następnie funkcja sprawdza czy połączenie z bazą istnieje i jeżeli wszystko jest ok to pobiera rekordy z bazy. Czy jest to lepsze rozwiązanie?

Czy mieliście doświadczenie z DBI? W jaki sposób powinienem przerobić funkcję, aby zwiększyć wydajność i niezawodność skryptu?

Dwie rady:

  • nawiązuj połączenie tylko raz, na początku programu i trzymaj utworzone połączenie w cache
  • jeśli nawiązanie połączenia się nie powiedzie to wyjdź ze skryptu.

Pisane z pamięci:

def connection return @connection if @connection @connection = DBI.connect("DBI:Pg:#{@@db_name}:#{@@db_ip}", @@db_user, @@db_password) end
Używaj tego po prostu przez connection.select_one(query).

Jeśli DBI.connect nie zadziała to rzuci wyjątek. Ponieważ nie jest on łapany więc program sam wyjdzie i zostawi Ci stacktrace w konsoli. Co więcej taka sytuacja może zdarzyć się tylko raz - przy tworzeniu połączenia.

Możesz też swobodnie zignorować błędy podczas używania connection() - bo jeśli Twoje query spowodowało błąd to i tak program może co najwyżej się wywalić. Nie ma sensu udawać, że nic się nie stało łapiąc wyjątek, prawda? Program wywala się natychmiast jak tylko coś się nie uda - pozwala to na szybkie i łatwe zdiagnozowanie błędu.

Rozumiem. Dzięki za odpowiedź i radę! Pozdrawiam