基于ThreadLocal連接容器的數據庫連接獲取方法和裝置的制造方法
【技術領域】
[0001]本發(fā)明涉及數據庫技術領域,特別是涉及一種基于ThreadLocal連接容器的數據庫連接獲取方法和裝置。
【背景技術】
[0002]在基于Java的應用系統中,用戶發(fā)HTTP(HyperText Transfer Protocol,超文本傳輸協議)請求給JSP(Java Server Pages,java服務器頁面)頁面,對應的JSP頁面需要進行數據庫操作,針對數據庫的連接資源的管理問題,常規(guī)的方案中提出了數據庫連接池的思想,為數據庫連接建立一個“緩沖池” 一一數據庫連接池,預先在數據庫連接池中放入一定數量的數據庫連接,當需要建立數據庫連接時,直接從數據庫連接池中取出,使用完畢之后再放回去數據庫連接池。但是,現有技術中,沒有考慮到數據庫連接池中的連接為應用相同數據源多次請求的連接,每次請求都會到數據庫連接池中取不同的連接,占用連接池資源,當用戶量較大,出現高并發(fā)現象時,將會造成數據庫連接池頻繁地創(chuàng)建數據庫連接,對數據庫造成極大的壓力。
【發(fā)明內容】
[0003]有鑒于此,本發(fā)明實施例提供一種基于ThreadLocal連接容器的數據庫連接獲取方法和裝置,以解決現有技術中當數據庫連接池中的連接為應用相同數據源多次請求的連接時,每次請求都會到數據庫連接池中取不同的連接,占用連接池資源,當用戶量較大,出現高并發(fā)現象時,將會造成數據庫連接池頻繁地創(chuàng)建數據庫連接,對數據庫造成極大的壓力的問題。
[0004]為實現上述目的,本發(fā)明實施例提供如下技術方案:
[0005]—種基于ThreadLocal連接容器的數據庫連接獲取方法,包括:
[0006]接收數據庫連接獲取請求,確定所述數據庫連接獲取請求中當前訪問指令相對應的數據源名稱;
[0007]若ThreadLocal連接容器開啟共享,貝Ij判斷所述ThreadLocal連接容器的HashMap中是否存在所述數據源名稱相對應的數據庫連接;
[0008]若存在,則從所述ThreadLocal連接容器的HashMap中獲取所述數據庫連接;若不存在,則從數據庫連接池中獲取所述數據庫連接,并將所述數據庫連接放入所述ThreadLocal連接容器的HashMap中;
[0009]確定所述數據庫連接獲取請求中下一訪問指令相對應的數據源名稱。
[0010]其中,所述確定所述數據庫連接獲取請求相對應的數據源名稱后還包括:
[0011]若所述ThreadLocal連接容器未開啟共享,則直接從數據庫連接池中獲取所述數據源名稱相對應的數據庫連接。
[0012]其中,從所述ThreadLocal連接容器的HashMap中獲取所述數據庫連接后,或從數據庫連接池中獲取所述數據庫連接后,或直接從數據庫連接池中獲取所述數據源名稱相對應的數據庫連接后還包括:根據獲取的數據庫連接訪問數據庫。
[0013]其中,所述根據獲取的數據庫連接訪問數據庫包括:
[0014]根據獲取的數據庫連接向數據庫寫入數據、根據獲取的數據庫連接讀取所述數據庫內數據、根據獲取的數據庫連接對所述數據庫內數據進行刪除和根據獲取的數據庫連接對所述數據庫內數據進行修改中的至少一種。
[0015]其中,若所述ThreadLocal連接容器開啟共享,則根據所述數據庫連接獲取請求中所有訪問指令訪問數據庫完成后還包括:關閉所述ThreadLocal連接容器的HashMap中所有數據庫連接,并清空所述ThreadLocal連接容器的HashMap;
[0016]若所述ThreadLocal連接容器未開啟共享,則所述直接從數據庫連接池中獲取所述數據源名稱相對應的數據庫連接后還包括:在所述ThreadLocal連接容器的自動關閉列表記錄所述直接從數據庫連接池中獲取的數據庫連接;所述根據所述數據庫連接獲取請求中所有訪問指令訪問數據庫完成后還包括:關閉所述ThreadLocal連接容器的自動關閉列表中記錄的數據庫連接,并清空所述ThreadLocal連接容器的自動關閉列表。
[0017]其中,若所述ThreadLocal連接容器開啟共享,則根據所述數據庫連接獲取請求中所有訪問指令訪問數據庫完成后還包括:關閉所述ThreadLocal連接容器的HashMap中所有數據庫連接相對應的Statement ;
[0018]若所述ThreadLocal連接容器未開啟共享,則根據所述數據庫連接獲取請求中所有訪問指令訪問數據庫完成后還包括:關閉所述ThreadLocal連接容器的自動關閉列表中記錄的數據庫連接相對應的Statement。
[0019]一種基于ThreadLocal連接容器的數據庫連接獲取裝置,包括:接收模塊、判斷模塊、第一獲取模塊和第二獲取模塊;其中,
[0020]所述接收模塊,用于接收數據庫連接獲取請求,確定所述數據庫連接獲取請求中當前訪問指令相對應的數據源名稱;
[0021 ] 所述判斷模塊,用于當ThreadLocal連接容器開啟共享時,判斷所述ThreadLocal連接容器的HashMap中是否存在所述數據源名稱相對應的數據庫連接;?0022] 所述第一獲取模塊,用于當所述判斷模塊判定所述ThreadLocal連接容器的HashMap中存在所述數據源名稱相對應的數據庫連接時,從所述ThreadLocal連接容器的HashMap中獲取所述數據庫連接;
[0023]所述第二獲取模塊,用于當所述判斷模塊判定所述ThreadLocal連接容器的HashMap中不存在所述數據源名稱相對應的數據庫連接時,從數據庫連接池中獲取所述數據庫連接,并將所述數據庫連接放入所述ThreadLocal連接容器的HashMap中。
[0024]其中,所述基于ThreadLocal連接容器的數據庫連接獲取裝置還包括:第三獲取模塊,用于當所述ThreadLocal連接容器未開啟共享時,直接從數據庫連接池中獲取所述數據源名稱相對應的數據庫連接。
[0025]其中,所述基于ThreadLocal連接容器的數據庫連接獲取裝置還包括:數據訪問模塊,用于在所述第一獲取模塊從所述ThreadLocal連接容器的HashMap中獲取所述數據庫連接后,或在所述第二獲取模塊從數據庫連接池中獲取所述數據庫連接后,或在所述第三獲取模塊直接從數據庫連接池中獲取所述數據源名稱相對應的數據庫連接后,根據獲取的數據庫連接訪問數據庫。
[0026]其中,所述基于ThreadLocal連接容器的數據庫連接獲取裝置還包括:第一連接關閉模塊、記錄模塊和第二連接關閉模塊;
?0027] 所述第一連接關閉模塊,用于當所述ThreadLocal連接容器開啟共享時,所述數據訪問模塊根據所述數據庫連接獲取請求中所有訪問指令訪問數據庫完成后,關閉所述ThreadLocal連接容器的HashMap中所有數據庫連接,并清空所述ThreadLocal連接容器的HashMap;
[0028]所述記錄模塊,用于所述第三獲取模塊直接從數據庫連接池中獲取所述數據源名稱相對應的數據庫連接后,在所述ThreadLocal連接容器的自動關閉列表記錄所述直接從數據庫連接池中獲取的數據庫連接;
[0029]所述第二連接關閉模塊,用于當所述ThreadLocal連接容器未開啟共享時,所述數據訪問模塊根據所述數據庫連接獲取請求中所有訪問指令訪問數據庫完成后,關閉所述ThreadLocal連接容器的自動關閉列表中記錄的數據庫連接,并清空所述ThreadLocal連接容器的自動關閉列表。
[°03°]基于上述技術方案,本發(fā)明實施例提供的一種基于ThreadLocal連接容器的數據庫連接獲取方法,接收數據庫連接獲取請求后,確定該數據庫連接獲取請求中當前訪問指令相對應的數據源名稱,若ThreadLocal連接容器開啟共享,貝Ij判斷該ThreadLocal連接容器的HashMap中是否存在該數據源名稱相對應的數據庫連接,若存在,則從該ThreadLocal連接容器的HashMap中獲取該數據庫連接;若不存在,則從數據庫連接池中獲取該數據庫連接,并將該數據庫連接放入該ThreadLocal連接容器的HashMap中,在獲取當前訪問指令所需的數據庫連接后,確定該數據庫連接獲取請求中下一訪問指令相對應的數據源名稱,繼續(xù)獲取該下一訪問指令所需的數據庫連接。在ThreadLocal連接容器開啟共享時,若某訪問指令需獲取的數據庫連接不在該ThreadLocal連接容器的HashMap中,則從數據庫連接池中獲取該數據庫連接,并將該數據庫連接放入ThreadLocal連接容器的HashMap中,如此,當下次需要獲取該數據庫連接時,便可從該ThreadLocal連接容器的HashMap中獲取該數據庫連接,復用數據庫連接池中的連接,而無需再去數據庫連接池后獲取該數據庫連接,如此,可避免每次均從數據庫連接池中創(chuàng)建連接,減少在數據庫連接池中獲取數據庫連接的次數,提高數據庫連接的使用效率,降低數據庫連接池的資源占用,減輕數據庫壓力,提高數據庫連接獲取效率。
【附圖說明】
[0031]為了更清楚地說明本發(fā)明實施例或現有技術中的技術方案,下面將對實施例或現有技術描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的