[英]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.