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?
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.