数据库连接池

And*_*Gis 4 ruby database sinatra

我在Sinatra中创建了一个小聊天应用程序,在heroku上创建了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
Run Code Online (Sandbox Code Playgroud)

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

rob*_*tus 6

是的,这是真的,每次发送'发送'后,你真的打开一个新的数据库连接.

所以你需要改变它.一种可能性是,在全球范围内打开连接:

 $con = PGconn.connect($dbhost, 5432, "","",$dbname, $dbuser, $dbpass)
Run Code Online (Sandbox Code Playgroud)

这应该在初始化$ dbname ...变量之后但在使用任何路由之前完成.

但是,如果您使用的是模块化的sinatra版本,而不是经典版本,则可以使用声明实例变量

attr_accessor :con
Run Code Online (Sandbox Code Playgroud)

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