在資料庫代理層中,寫節點的資料庫連接是一種很重要和稀缺的資源,提升其利用率是一個提升資料庫整體性能的重要手段。資料庫連接占用過高會大幅增加資料庫的資源負擔,降低資料庫的處理能力。通過延遲啟動的事務,可以減少不必要的連接占用時長,提升資料庫連接利用率。 ...
本文分享自天翼雲開發者社區《一種通過延遲事務提升資料庫性能的方法》,作者:唐****律
一、背景
在資料庫代理層中,寫節點的資料庫連接是一種很重要和稀缺的資源,提升其利用率是一個提升資料庫整體性能的重要手段。資料庫連接占用過高會大幅增加資料庫的資源負擔,降低資料庫的處理能力。通過延遲啟動的事務,可以減少不必要的連接占用時長,提升資料庫連接利用率。
在用戶通過代理層使用資料庫的時候,如果提交了一條只讀查詢,那麼代理層可以從連接池中獲取一個連接、查詢、獲取數據、然後歸還連接。
如果在只讀查詢之前啟動了事務,那麼在用戶提交或者回滾事務之前,該連接不能歸還到連接池,大大增加了資料庫連接的占用時間。
而在ReadCommitted事務隔離級別中,只讀查詢語句的查詢結果是不可重覆的,這時如果事務中沒有其它寫操作,那麼是否啟動事務,對於用戶實際使用是沒有影響的,這樣則產生了不必要的事務,增加了資料庫連接占用的時間,降低了資料庫連接的利用率。
二、方案
本發明提出一種通過延遲啟動事務的方法,減少不必要的連接占用時長,提升資料庫連接利用率,進而提升資料庫的整體性能。具體實現步驟如下:
1、在用戶連接未進入事務狀態且在ReadCommitted事務隔離級別時,如果用戶啟動事務,則記錄其事務狀態為已開啟,但實際上不獲取資料庫連接開啟事務。
2、如果用戶提交的SQL為SELECT等只讀查詢,則直接轉發SQL到寫節點或者讀節點。如果用戶提交的SQL需要進行寫操作,則根據事務狀態,在轉發SQL到寫節點之前先啟動事務,並記錄實際事務狀態。
3、用戶提交或者回滾事務,如果實際事務狀態為未開啟,則跳過結束事務操作,否則按正常流程先結束事務再回收資料庫連接。
三、優點
pgpool-II、pgbouncer等開源連接池組件,支持連接復用,但在事務處理上沒有對此進行優化,這導致其在benchmarkSQL測試中性能受到影響,因benchmarkSQL性能測試中針對所有語句都會開啟事務。其它資料庫ORM框架例如Mybatis也有預設啟動事務執行SQL的選項,所以此項優化是有必要的。