不与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时所做的。
为什么我收到此错误。
答案 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发送一个查询。如果您通过一个连接发送多个查询,则会收到等待结果消息。
使用连接池,你应该没问题。