首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据库连接池

数据库连接池
EN

Stack Overflow用户
提问于 2011-11-01 19:33:28
回答 3查看 8K关注 0票数 4

我在heroku上用Sinatra和jQuery创建了一个小聊天应用程序。它只是在用户提交消息时向数据库插入一条消息。并且每2秒下载一次新消息。经过几分钟的测试,它停止了工作,我收到了heroku的电子邮件:

嗨,

我们注意到gisekchat应用程序有大量连接打开到共享数据库。由于性能原因,我们不得不限制连接到共享数据库的数量。您是否可以减少到共享数据库的总体连接数量,或者移动到专用数据库?

显然,您没有利用连接池,而是为您的应用程序中的每个请求打开一个新的数据库连接。

谢谢,-Chris

这是支持提交消息的操作(接收非常类似):

代码语言:javascript
复制
post '/send' do
  con = con = PGconn.connect($dbhost, 5432, "","",$dbname, $dbuser, $dbpass)
  con.exec("insert into messages(usr, msg, date) values('#{params[:usr]}','#{params[:msg]}', now())")    
end

如何更改它以启用连接池?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-01 19:46:14

是的,这是真的,你真的是打开了一个新的连接到数据库,每次有一个‘发送’-帖子发送。

所以你需要改变这一点。一种可能是,在全球范围内开放这一联系:

代码语言:javascript
复制
 $con = PGconn.connect($dbhost, 5432, "","",$dbname, $dbuser, $dbpass)

这应该在你初始化你的$dbname之后.变量,但在使用任何路由之前。

但是,如果您使用的是模块化的sinatra版本,而不是经典的版本,则可以使用

代码语言:javascript
复制
attr_accessor :con

并在应用程序启动之前初始化它。

票数 6
EN

Stack Overflow用户

发布于 2011-11-01 20:58:32

在此过程中,创建一个实例变量将为类的每个实例创建一个连接。

您需要的是一个线程安全的数据存储api,它将使用互斥对象来处理对连接对象的访问。这是ActiveRecord在rails中使用的控制机制。

我创建了一个名为'q‘的红宝石,它提供了一个简单的机制来完成这个任务。宝石位于这里:https://github.com/jacobsimeon/q

安装像这样的git clone https://github.com/jacobsimeon/q

然后将其添加到初始化应用程序的任何文件中:require 'q/resourcepool'

然后,在初始化期间创建数据存储:

代码语言:javascript
复制
class DataConnection < ResourcePool
  def create_resource
    PGConn.connect(@config)
  end
end
@datasource = ResourcePool.new(your_connection_info_here)

然后,可以使用@数据源对数据库执行命令

代码语言:javascript
复制
post '/send' do
  @datasource.exec(standard_postgres_params)
end

如果您对这条路线感兴趣,请在github或twitter上与我联系(@jacobsimeon )。

票数 4
EN

Stack Overflow用户

发布于 2013-03-23 14:31:26

我使用了“经典”sinatra应用程序,并且通过声明类变量(例如@@db_connection )获得了相同的结果。这总是使用相同的连接,并适用于我。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7971832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档