我應該在一段時間內分散許多連接,還是同時敲擊數據庫?
我目前在 Amazon RDS 上有一個相當小的(微型,但可以根據需要升級)Postgres 數據庫實例。我認為我的最大連接數約為 85(通過
max_connections
控制台中的值檢查),儘管我可能會稍微調整一下。我有一個調度程序,每 1 分鐘將 1000 個作業排入隊列,這些作業將在作業完成幾秒鐘後進行 1 次讀取(單個查詢,無連接),然後進行 1 次寫入(單個插入,一個表)。
這些作業由兩個具有 25 個連接池的工作人員執行,它們之間總共有 50 個,其餘的連接由我的應用程序使用。
所以問題是:用 1000 次讀取然後在幾秒鐘後每 1 分鐘寫入 1000 次來錘擊我的數據庫是否明智,或者相反,將負載分散到每秒大約 16 次讀取和寫入?
後者聽起來好多了,但它在其他地方確實涉及更多的複雜性。
編輯:我一點也不建議我進行 1000 次讀取,而一次讀取就足夠了。我在工作作業(單獨的程序)中執行這些查詢,所以我不能在不使用中間儲存的情況下簡單地批量讀取這些行。認為我應該澄清,因為第一個答案似乎假設我不了解數據庫是如何工作的。
編輯 2:已決定從數據庫流式傳輸這些行並將它們傳遞到我正在使用的語言的並發流媒體中,然後將結果的塊提供給批量插入的程序。
感謝所有的答案。
我相信如果您將大約 1000 個作業放入隊列中以進行處理,您應該能夠讓一個事件訂閱該作業的完成,或者從該作業返回一個帶有狀態的對象。以該事件為例,讓一個工作人員在幾秒鐘內寫入或批處理請求,然後將幾條記錄一起寫入數據庫。讓工作人員的結果寫入經過處理以寫入記錄的對象。鎖定對象的記憶體比嘗試使用所有這些連接的所有成本要好得多。
根據環境和發生崩潰時記錄失去的敏感性,您始終可以將狀態消息寫入 List 對象,並讓事件計時器每 1 到 5 秒觸發一次,以將更新寫入數據庫。
如果您想為讀取函式使用最近發送的相同事件,您可以始終將它們保存在記憶體中以供工作會話使用,並將它們作為持久日誌寫入數據庫。