簡體   English   中英

數據庫連接池

[英]Database connection pooling

我在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

我該如何更改它以啟用連接池?

是的,這是真的,每次發送'發送'后,你真的打開一個新的數據庫連接。

所以你需要改變它。 一種可能性是,在全球范圍內打開連接:

 $con = PGconn.connect($dbhost, 5432, "","",$dbname, $dbuser, $dbpass)

這應該在初始化$ dbname ...變量之后但在使用任何路由之前完成。

但是,如果您使用的是模塊化的sinatra版本,而不是經典版本,則可以使用聲明實例變量

attr_accessor :con

並在應用程序啟動之前初始化它。

Robustus在那里創建一個實例變量將為您的類的每個實例創建一個連接。

你想要的是一個線程安全的數據存儲api,它將使用互斥鎖來處理對你的連接對象的訪問。 這是ActiveRecord在rails中使用的控制機制。

我創建了一個名為'q'的ruby gem,它提供了一個簡單的機制來實現這一點。 寶石位於: 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)

然后,您可以使用@datasource對數據庫執行命令

post '/send' do
  @datasource.exec(standard_postgres_params)
end

如果您對這條路線感興趣,請通過github或twitter(@jacobsimeon兩者)與我聯系。

我使用了'經典'sinatra應用程序,並通過聲明類變量獲得了相同的結果:例如@@ db_connection。 這總是使用相同的連接,並為我工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM