Mysql2:: Ошибка: это соединение используется

Мы случайно получаем следующую ошибку в нашем наборе тестов с очистителем базы данных. Мы используем очиститель баз данных в сочетании со следующими двумя фрагментами кода, которые, как я думаю, связаны между собой:

Ошибка

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

Совместное подключение к базе данных (вероятная причина)

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

Ответ 1

Ошибка говорит вам, что очиститель БД хочет сделать усечение, в то время как другой поток все еще использует соединение. Это, вероятно, происходит в ваших тестах интеграции с селеном.

Похоже, вы используете 2 механизма очистки базы данных:

  • транзакционные светильники с патчами общих подключений
  • усечение с очистителем базы данных

Это не нормально. Чтобы использовать очиститель БД, отключите транзакционные приборы и удалите патч общего доступа. Я предлагаю настроить его так, как описано в этой замечательной статье Авди Гримма: http://devblog.avdi.org/2012/08/31/configuring-database_cleaner-with-rails-rspec-capybara-and-selenium/