【问题标题】:how to solve 'Mysql2::Error: This connection is still waiting for a result' error with mysql2 and activerecord如何解决 mysql2 和 activerecord 的“Mysql2::Error: This connection is still waiting for a result”错误
【发布时间】:2012-01-18 09:38:38
【问题描述】:

不与this question with the same title重复

我正在使用带有 mysql2 的 activerecord,并且我正在设计一次处理对同一个 activerecord 模型/类的 10 个查询。 请注意,我使用的是严格的 activerecord,而不是直接使用 mysql 查询。

我在 Sinatra 中接听电话,然后使用 activerecord 从数据库中获取数据。

我不希望呼叫被阻塞,因此我使用了mysql2,并且我确实想要使用 em-synchrony。

但现在我在随后的同时调用中收到以下“Mysql2::Error: 此连接仍在等待结果,一旦获得结果再试一次:”。

我没有与 pool=10 建立连接

我的班级

  class User < ActiveRecord::Base 

和我要调用的代码 user.find(:all, :conditions => ["id=?", userid])

mysql2 文档说“要使用 ActiveRecord 驱动程序(带或不带 rails),您需要做的就是安装此 gem 并将 database.yml 中的适配器设置为“mysql2”。这很简单吧? :)"

这正是我从 mysql 迁移到 mysql2 时所做的。

为什么会出现这个错误。

【问题讨论】:

  • 如果您可以向我们展示您的应用程序代码,这将有所帮助(如果您不能或不想展示真实的应用程序,请制作一个最小的示例并放在 github 上)。它还取决于您使用什么 http 服务器来提供服务。
  • 我正在使用由 Thin 支持的 Sinatra。我会尝试提出要点。

标签: eventmachine mysql2


【解决方案1】:

这是一个完整的示例:

require 'rubygems'
gem 'activerecord', '~> 3.1.0'
gem 'sinatra',      '~> 1.3.1'
gem 'mysql2',       '~> 0.3.11'

require 'active_record'
require 'sinatra/base'
require 'mysql2'

# thin use the eventmachine thread pool
# you should have at least one connection per thread
# or you can expect errors
EM::threadpool_size = 10

# connect to the database
ActiveRecord::Base.establish_connection(
    :adapter => "mysql2",
    :database => "test",
    :username => "root",
    :encoding => 'utf8',
    # number of connections openened to the database
    :pool => 10
  )

class App < Sinatra::Base  
  get '/db' do
    ActiveRecord::Base.connection.execute("SELECT SLEEP(1)")
  end
end

run App

要运行它,将文件保存为“config.ru”并以线程模式运行它:

thin start -e production --threaded

你可以使用ab来检查一切是否正常,我使用了一个叫siege的工具:

siege -c 10 -r 1 http://localhost:3000/db

【讨论】:

    【解决方案2】:

    你应该使用 ConnectionPool...不知何故你有 2 个连接处于竞争状态。

    我不使用 Sinatra,我使用 Rails,但我遇到了同样的问题并这样解决了:

    #  class ActiveRecord::Base
    #   mattr_accessor :shared_connection
    #   @@shared_connection = nil
    # 
    #   def self.connection
    #     @@shared_connection || retrieve_connection
    #   end
    # end
    # 
    # ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection
    
    class ActiveRecord::Base
      mattr_accessor :shared_connection
      @@shared_connection = nil
    
      def self.connection
        @@shared_connection || ConnectionPool::Wrapper.new(:size => 1) { retrieve_connection }
      end
    end
    
    ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection
    

    【讨论】:

    • Ps:我只在测试环境中遇到过这个问题,因为应用程序和集成测试中使用的 webdriver 之间存在共享连接。
    【解决方案3】:

    您必须使用连接池。 mysql2 允许查询是异步的,但您仍然一次只能通过一个连接向 MySQL 发送一个查询。如果您通过一个连接发送多个查询,则会收到等待结果消息。

    使用连接池应该没问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-21
      • 2018-08-05
      • 2015-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多