【发布时间】:2025-12-02 11:25:01
【问题描述】:
我正在编写一个多线程 Ruby 应用程序,该应用程序通过 dm-sweatshop 生成数据并将其加载到旧版 MySQL 数据库中以用于负载测试。一切正常,有一个例外,我正在加载几百万条记录,但我似乎无法增加数据库连接池的大小来更快地完成工作。它似乎卡在 10 个连接上。我尝试增加应用程序本身的线程池大小,但观察 MySQL,我似乎无法建立超过 10 个连接。
我最初只是使用 URL 来设置 DataMapper:
DataMapper.setup(:default, 'mysql://user:password@db-server/testing')
但我已移至此尝试设置数据库池大小:
DataMapper.setup(:default, {
:adapter => 'mysql',
:pool => 20,
:host => 'db-server',
:database => 'testing',
:username => 'user',
:password => 'password'
})
如何增加池大小?我觉得我已经倾注了在 DataMapper 上可以找到的所有 RDoc 和文档,但我找不到如何去做。此时我会切换到 ActiveRecord 来完成这项工作,但它不支持复合主键,而我需要这个旧版数据库。
作为参考,我将“线程/池”gem 用于多线程,并且该应用程序在 Ruby 1.9.3 中运行。以下是我在多个线程中使用 DataMapper 的方式:
pool = Thread::Pool.new(@config[:thread_pool_size])
...
10000.times { pool.process {Customer.gen} }
...
pool.shutdown
sleep 5
puts "DONE!"
【问题讨论】:
-
你确定不是 MySQL 限制了连接?
-
一切皆有可能,但这是在我的 Mac 上全新安装的 MySQL,我刚刚检查了
max_connections变量,它仍然是默认值 151。我还验证了运行多个实例我的 Ruby 脚本创建了到同一个 MySQL 服务器的 10 个连接的倍数。我认为可以肯定地说它是 DataMapper 或 MySQL 适配器。 -
有想过这个吗?
-
不...继续前进。刚刚接受我需要运行更多工具实例(并且必须调整我的数据生成以进行适当调整以避免冲突)。
标签: mysql ruby ruby-datamapper