新手问题 求助!关于不同 web-server 下,Grape 的数据库连接池管理

vode · 2014年11月04日 · 最后由 ChrisLoong 回复于 2014年11月04日 · 2141 次阅读

最近正在开发一个 Grape 的 standalone 项目,ORM 使用了 AR 和 Sequel, 现在对数据库连接池的管理产生了深深的疑问,Sequel 和 AR 都实现了线程间连接池的共享,但是 web-server 有不同的并发机制,对于支持多线程的 web-server,也是针对请求创建新的 thread,这些服务器线程能否调用 ORM 的连接池?而且 rails 也使用了 ActiveRecord::ConnectionAdapters::ConnectionManagement 保证请求处理完成后,清理活跃的连接,所以 ORM 连接池的意义在哪,只是针对单个请求么?求解答。

PS,我上传了一个头像之后为啥就换不了了?!!!

好问题,但是提到的方面太多,其实,主要就是 ORM 的连接池问题吧?

建议阅读 Sequel 默认使用的连接池代码,重点看这个函数,还有这个函数,以及这个函数。 Sequel 的连接池中,默认的最大连接数是 4,你也可以通过 max_connections 修改最大连接数。

模拟多线程的 DB 操作: *使用 sequel 和 postgresql

#sequel连接pg略

all_threads = []
(1..10).each do |a|
  t = Thread.new do
    DB.run("select pg_sleep(3);")
  end
  all_threads << t
end

all_threads.each do |t|
  t.join
end
puts 'demo end'

在上面的代码执行期间,可以在数据库中,查看连接:

SELECT query,pid FROM pg_stat_activity where client_addr='你的IP';

结果类似这样:

所以,你想想,在多线程的 app server 中,如果有 4 个请求同时在处理,那么通过 ORM 的连接池,可以获取各自的数据库连接,进行 IO 操作,而不是等待数据库连接。

而在 unicorn 这种进程型的 app server,连接池的意义确实不大,因为请求在进程中,就是逐个处理的。就算是同时处理,也都是在不同的 worker 进程中进行。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号