如何使用mysql2和activerecord解决'Mysql2 :: Error:此连接仍在等待结果'错误

时间:2011-12-12 11:25:14

标签: eventmachine mysql2

不与this question with the same title

重复

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

我在Sinatra接到调用,然后使用activerecord从数据库中获取数据。

我不希望阻止这些呼叫,因此我使用了mysql2而我 NOT 想要使用em-synchrony。

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

我没有与pool = 10建立连接

我的班级

  class User < ActiveRecord::Base 

和我要调用的代码      user.find(:all,:conditions =&gt; [“id =?”,userid])

mysql2 doc说“要使用ActiveRecord驱动程序(有或没有rails),你需要做的就是安装这个gem并将database.yml中的适配器设置为”mysql2“。这很容易吗? :)“

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

为什么我收到此错误。

3 个答案:

答案 0 :(得分:3)

这是一个完整的例子:

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

答案 1 :(得分: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

答案 2 :(得分:0)

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

使用连接池,你应该没问题。