我在heroku上用Sinatra和jQuery创建了一个小聊天应用程序。它只是在用户提交消息时向数据库插入一条消息。并且每2秒下载一次新消息。经过几分钟的测试,它停止了工作,我收到了heroku的电子邮件:
嗨,
我们注意到gisekchat应用程序有大量连接打开到共享数据库。由于性能原因,我们不得不限制连接到共享数据库的数量。您是否可以减少到共享数据库的总体连接数量,或者移动到专用数据库?
显然,您没有利用连接池,而是为您的应用程序中的每个请求打开一个新的数据库连接。
谢谢,-Chris
这是支持提交消息的操作(接收非常类似):
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如何更改它以启用连接池?
发布于 2011-11-01 19:46:14
是的,这是真的,你真的是打开了一个新的连接到数据库,每次有一个‘发送’-帖子发送。
所以你需要改变这一点。一种可能是,在全球范围内开放这一联系:
$con = PGconn.connect($dbhost, 5432, "","",$dbname, $dbuser, $dbpass)这应该在你初始化你的$dbname之后.变量,但在使用任何路由之前。
但是,如果您使用的是模块化的sinatra版本,而不是经典的版本,则可以使用
attr_accessor :con并在应用程序启动之前初始化它。
发布于 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'
然后,在初始化期间创建数据存储:
class DataConnection < ResourcePool
def create_resource
PGConn.connect(@config)
end
end
@datasource = ResourcePool.new(your_connection_info_here)然后,可以使用@数据源对数据库执行命令
post '/send' do
@datasource.exec(standard_postgres_params)
end如果您对这条路线感兴趣,请在github或twitter上与我联系(@jacobsimeon )。
发布于 2013-03-23 14:31:26
我使用了“经典”sinatra应用程序,并且通过声明类变量(例如@@db_connection )获得了相同的结果。这总是使用相同的连接,并适用于我。
https://stackoverflow.com/questions/7971832
复制相似问题