【问题标题】:DataMapper DB pool in Ruby AppRuby App 中的 DataMapper 数据库池
【发布时间】: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


【解决方案1】:

考虑到这个问题很老而且 DataMapper 不再维护它有点过时了,但为了完整起见:DataMapper 使用硬编码的池大小8 并忽略您的配置。

另见:Datamapper & connection pool logic

【讨论】: