2013-06-11 7 views
11

Otrzymujemy następujący błąd losowo w naszym pakiecie testowym z czystym bazą danych. Używamy do czyszczenia bazy danych w połączeniu z dwóch poniższych fragmentów kodu, które moim zdaniem są związane:Mysql2 :: Błąd: to połączenie jest używane przez

Błąd:

Mysql2::Error: This connection is in use by: #<Thread:0x00000017bbf2f8 sleep>: TRUNCATE TABLE `cr_contacts`; 

Shared DB Connection (prawdopodobną przyczyną)

class ActiveRecord::Base 
    mattr_accessor :shared_connection 
    @@shared_connection = nil 

    def self.connection 
    @@shared_connection || retrieve_connection 
    end 
end 

# Forces all threads to share the same connection. This works on 
# Capybara because it starts the web server in a thread. 
ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection 

Odpowiedz

9

Błąd mówi, że program czyszczący DB chce usunąć obcinanie, podczas gdy inny wątek nadal korzysta z połączenia. Prawdopodobnie dzieje się tak w testach integracyjnych z selenem.

Wygląda używasz 2 mechanizmy czyszczenia bazy danych:

  • transakcyjnych urządzeń z przyłączami udostępnione łaty
  • obcinania czyszczącym bazy

To nie jest w porządku. Aby użyć narzędzia czyszczącego DB, wyłącz urządzenia transakcyjne i usuń udostępnioną poprawkę połączenia. Sugeruję skonfigurowanie go w sposób opisany w tym wspaniałym artykule autorstwa Avdi Grimm: http://devblog.avdi.org/2012/08/31/configuring-database_cleaner-with-rails-rspec-capybara-and-selenium/

Powiązane problemy