Ruby 数据库池赛璐珞ZMQ vs赛璐珞vs线程
我看到了一些奇怪的问题,我试图理解,这个问题的第一部分是试图理解数据库池在赛璐珞和赛璐珞/ZMQ中是如何工作的 数据库池 1) 线。 注意,我正在输出线程使用的Ruby 数据库池赛璐珞ZMQ vs赛璐珞vs线程,ruby,multithreading,postgresql,activerecord,celluloid,Ruby,Multithreading,Postgresql,Activerecord,Celluloid,我看到了一些奇怪的问题,我试图理解,这个问题的第一部分是试图理解数据库池在赛璐珞和赛璐珞/ZMQ中是如何工作的 数据库池 1) 线。 注意,我正在输出线程使用的连接id。 O/p O/p 接收方(又称服务器) 现在,有趣的部分。执行此命令时 我看到以下输出 {"version"=>"PostgreSQL 9.4.5 ..."} --- 70299372892280 <- connection id {"version"=>"PostgreSQL 9.4.5 ..."} -
连接id
。
O/p
O/p
- 接收方(又称服务器)
{"version"=>"PostgreSQL 9.4.5 ..."} --- 70299372892280 <- connection id
{"version"=>"PostgreSQL 9.4.5 ..."} --- 70299372892280
{"version"=>"PostgreSQL 9.4.5 ..."} --- 70299372892280
{"version"=>"PostgreSQL 9.4.5 ..."} --- 70299372892280
{"version"=>"PostgreSQL 9.4.5 ..."} --- 70299372892280
{“版本”=>“PostgreSQL 9.4.5…”---70299372892280“PostgreSQL 9.4.5…”---7029937292280
{“版本”=>“PostgreSQL 9.4.5…”---70299372892280
{“版本”=>“PostgreSQL 9.4.5…”---70299372892280
{“版本”=>“PostgreSQL 9.4.5…”---70299372892280
所有查询都使用相同的连接id
这就是我的问题
为什么赛璐珞/ZMQ
使用相同的连接id。
理想情况下,它应该为每个异步
调用使用不同的,因为一个接收方
为多个发送方
实例提供服务。
注意:Celluloid::ZMQ
示例中的Sender
不处理记录本身。许多人把它们交给一个接收者。因此,您可以看到连接被接收器
独占使用,这也是一种有效的行为,如下所示
如果您希望它有所不同,那么您将需要第三种类型的参与者,他们在其生命周期中只处理一个数据库连接。这可能是前两种方法和后一种方法的组合。因为一个接收者
正在为许多发送者
实例提供服务。
注意:Celluloid::ZMQ
示例中的Sender
不处理记录本身。许多人把它们交给一个接收者。因此,您可以看到连接被接收器
独占使用,这也是一种有效的行为,如下所示
如果您希望它有所不同,那么您将需要第三种类型的参与者,他们在其生命周期中只处理一个数据库连接。这是前两种方法和后一种方法的某种组合。我假设
.async
将使用池中的新连接id,至少这是我在普通赛璐珞示例中看到的。那么,为什么它在赛璐珞/zmq中的行为会不同呢创建连接池时,您的ActiveRecord
配置代码是什么?不,我没有任何配置代码,我计划使用ActiveRecord::connection<代码>与_连接之前,我无意中发现了上述问题。这突出了我在赛璐珞zmq中使用相同的连接id的async
可以更详细地解释上述内容,以及为什么每次使用async调用纯赛璐珞时都会创建一个新的连接id,而赛璐珞/zmq async没有假设。async
至少会使用池中的新连接id这就是我在普通赛璐珞示例中看到的。那么,为什么它在赛璐珞/zmq中的行为会不同呢创建连接池时,您的ActiveRecord
配置代码是什么?不,我没有任何配置代码,我计划使用ActiveRecord::connection<代码>与_连接之前,我无意中发现了上述问题。这突出了我在赛璐珞zmq中使用相同的连接id的async
可以更详细地解释上述内容,以及为什么纯赛璐珞每次使用async调用时都会创建一个新的连接id,而赛璐珞/zmq async没有
{"version"=>"PostgreSQL 9.4.5 .."} --- 70115833371600 <- connection id
{"version"=>"PostgreSQL 9.4.5 .."} --- 70115833339020 <- connection id
{"version"=>"PostgreSQL 9.4.5 .."} --- 70115833290000 ...
{"version"=>"PostgreSQL 9.4.5 .."} --- 70115833282580 ...
{"version"=>"PostgreSQL 9.4.5 .."} --- 70115833251100 ...
class PlainCelluloid
include Celluloid
def run
puts "#{ActiveRecord::Base.connection.execute('SELECT version();').first} --- #{ActiveRecord::Base.connection_id}"
sleep 5
end
end
5.times do
Sender.new.async.run
end
{"version"=>"PostgreSQL 9.4.5 .."} --- 70120202935840 <- connection id
{"version"=>"PostgreSQL 9.4.5 .."} --- 70120202902760 <- connection id
{"version"=>"PostgreSQL 9.4.5 .."} --- 70120186634700 ...
{"version"=>"PostgreSQL 9.4.5 .."} --- 70120186602720 ...
{"version"=>"PostgreSQL 9.4.5 .."} --- 70120186570720 ...
class Sender
include Celluloid::ZMQ
def initialize()
@socket = Socket::Push.new
@socket.connect('ipc:///tmp/qs11')
end
def write
@socket.send('Hello')
nil
end
end
class Receiver
include Celluloid::ZMQ
def initialize()
@socket = Socket::Pull.new
@socket.bind('ipc:///tmp/qs11')
end
def run
loop do
async.handle_message @socket.read
end
end
def handle_message(message)
puts "#{ActiveRecord::Base.connection.execute('SELECT version();').first} --- #{ActiveRecord::Base.connection_id}"
sleep 10
end
end
Receiver.new.async.run
5.times do
Sender.new.async.write
end
{"version"=>"PostgreSQL 9.4.5 ..."} --- 70299372892280 <- connection id
{"version"=>"PostgreSQL 9.4.5 ..."} --- 70299372892280
{"version"=>"PostgreSQL 9.4.5 ..."} --- 70299372892280
{"version"=>"PostgreSQL 9.4.5 ..."} --- 70299372892280
{"version"=>"PostgreSQL 9.4.5 ..."} --- 70299372892280