具有相同标题此问题的副本

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

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

我不wan't的呼叫阻拦所以因此我用mysql2 ,我希望使用EM-同步。

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

我没有建立与pool = 10的连接

我的课

  class User < ActiveRecord::Base 

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

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

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

为什么我收到此错误。

===============>>#1 票数: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

===============>>#2 票数: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

===============>>#3 票数:0

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

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

  ask by Anand translate from so

未解决问题?本站智能推荐: