aaa视频网站,国产最新进精品视频,国产主播一区二区,999热精品视频,а√天堂资源8在线官网在线,国产免费不卡av,麻豆国产视频

數(shù)據(jù)庫句柄處理方法、裝置和計算機設(shè)備與流程

文檔序號:11199237閱讀:689來源:國知局
數(shù)據(jù)庫句柄處理方法、裝置和計算機設(shè)備與流程

本發(fā)明涉及計算機技術(shù)領(lǐng)域,特別是涉及一種數(shù)據(jù)庫句柄處理方法、裝置和計算機設(shè)備。



背景技術(shù):

隨著計算機技術(shù)的發(fā)展,通過數(shù)據(jù)庫存儲文件數(shù)據(jù)廣泛應用于移動終端、pc(personalcomputer,個人計算機)客戶端。在使用過程中經(jīng)常面臨多線程并發(fā)的挑戰(zhàn),多線程并發(fā)發(fā)生時,一個線程訪問資源時,其他線程需要線性串行地等待其釋放資源。當線程并發(fā)數(shù)超過兩個時,較后執(zhí)行的線程,往往會被互斥鎖阻塞很長時間。

傳統(tǒng)的數(shù)據(jù)庫句柄處理方法,在數(shù)據(jù)庫打開時獲得一個句柄,該句柄作為不同線程的共享資源,一個數(shù)據(jù)庫只對應一個句柄,當多個線程對數(shù)據(jù)庫操作時,很容易在線程訪問句柄時產(chǎn)生阻塞,多線程互斥的概率很高,當互斥發(fā)生時,線程會頻繁進行狀態(tài)切換,大量消耗cpu線程切換的資源,導致性能下降,



技術(shù)實現(xiàn)要素:

基于此,有必要針對上述技術(shù)問題,提供一種數(shù)據(jù)庫句柄處理方法、裝置和計算機設(shè)備,能減少阻塞的發(fā)生,減少內(nèi)存資源的消耗,提高數(shù)據(jù)庫線程并發(fā)的性能。

一種數(shù)據(jù)庫句柄處理方法,所述方法包括:

獲取數(shù)據(jù)庫操作請求,判斷所述數(shù)據(jù)庫操作請求對應的操作是否為事務操作,如果是,則獲取所述事務操作對應的事務綁定的第一句柄,返回所述第一句柄;

如果不是事務操作,則判斷所述數(shù)據(jù)庫操作請求對應的當前線程中是否存在未完成句柄,如果是,則返回所述未完成句柄;

如果不存在未完成句柄,則從句柄池中通過句柄分發(fā)獲取第二句柄,返回所述第二句柄。

一種數(shù)據(jù)庫句柄處理裝置,所述裝置包括:

第一判斷模塊,用于獲取數(shù)據(jù)庫操作請求,判斷所述數(shù)據(jù)庫操作請求對應的操作是否為事務操作,如果是,則進入第一句柄返回模塊,否則進入第二判斷模塊;

第一句柄返回模塊,用于獲取所述事務操作對應的事務綁定的第一句柄,返回所述第一句柄;

第二判斷模塊,用于判斷所述數(shù)據(jù)庫操作請求對應的當前線程中是否存在未完成句柄,如果是,則返回所述未完成句柄,否則進入第二句柄返回模塊;

第二句柄返回模塊,用于從句柄池中通過句柄分發(fā)獲取第二句柄,返回所述第二句柄。

一種計算機設(shè)備,包括存儲器和處理器,所述存儲器中存儲有計算機可讀指令,所述計算機可讀指令被所述處理器執(zhí)行時,使得所述處理器執(zhí)行以下步驟:

獲取數(shù)據(jù)庫操作請求,判斷所述數(shù)據(jù)庫操作請求對應的操作是否為事務操作,如果是,則獲取所述事務操作對應的事務綁定的第一句柄,返回所述第一句柄;

如果不是事務操作,則判斷所述數(shù)據(jù)庫操作請求對應的當前線程中是否存在未完成句柄,如果是,則返回所述未完成句柄;

如果不存在未完成句柄,則從句柄池中通過句柄分發(fā)獲取第二句柄,返回所述第二句柄。

上述數(shù)據(jù)庫句柄處理方法、裝置和計算機設(shè)備,通過獲取數(shù)據(jù)庫操作請求,判斷數(shù)據(jù)庫操作請求對應的操作是否為事務操作,如果是,則獲取事務操作對應的事務綁定的第一句柄,返回所述第一句柄,如果不是事務操作,則判斷數(shù)據(jù)庫操作請求對應的當前線程中是否存在未完成句柄,如果是,則返回未完成句柄,如果不存在未完成句柄,則從句柄池中通過句柄分發(fā)獲取第二句柄,返回第二句柄,對于數(shù)據(jù)庫事務操作,可直接返回事務綁定的第一句柄,實現(xiàn)句柄在同一事務不同操作間的重用,對于當前線程中存在未完成句柄的情況,直接返回當前線程的未完成句柄,實現(xiàn)句柄在遞歸操作的不同操作間重用,可減少向句柄池申請獲取句柄的次數(shù),減少向句柄池申請獲取句柄時阻塞的發(fā)生,且無需每次操作都申請新的句柄,避免句柄冗余,減少內(nèi)存資源的消耗,減少句柄占用的文件占位符,避免大量數(shù)據(jù)庫操作情況下,句柄冗余導致數(shù)據(jù)庫甚至程序內(nèi)的所有文件都打開失敗的情形,提高了數(shù)據(jù)庫在使用過程中多線程并發(fā)的性能。

附圖說明

圖1為一個實施例中數(shù)據(jù)庫句柄處理方法的應用環(huán)境圖;

圖2為一個實施例中圖1中服務器的內(nèi)部結(jié)構(gòu)圖;

圖3為一個實施例中圖1中終端的內(nèi)部結(jié)構(gòu)圖;

圖4為一個實施例中數(shù)據(jù)庫句柄處理方法的流程圖;

圖5為一個實施例中生成新句柄后隊列狀態(tài)示意圖;

圖6為一個實施例中將尾部句柄的next指針指向新句柄后的隊列狀態(tài)示意圖;

圖7為一個實施例中將隊列的尾部指針指向新句柄后的隊列狀態(tài)示意圖;

圖8為一個實施例中句柄分發(fā)前隊列狀態(tài)示意圖;

圖9為一個實施例中移動頭部指針后的隊列狀態(tài)示意圖;

圖10為一個實施例中將句柄分發(fā)出去后得到的隊列狀態(tài)示意圖;

圖11為一個實施例中并發(fā)的寫操作請求時喚醒寫操作重試流程示意圖;

圖12為一個實施例中數(shù)據(jù)庫句柄處理裝置的結(jié)構(gòu)框圖;

圖13為另一個實施例中數(shù)據(jù)庫句柄處理裝置的結(jié)構(gòu)框圖;

圖14為再一個實施例中數(shù)據(jù)庫句柄處理裝置的結(jié)構(gòu)框圖;

圖15為又一個實施例中數(shù)據(jù)庫句柄處理裝置的結(jié)構(gòu)框圖;

圖16為再一個實施例中數(shù)據(jù)庫句柄處理裝置的結(jié)構(gòu)框圖;

圖17為一個實施例中即時通信應用界面示意圖。

具體實施方式

圖1為一個實施例中數(shù)據(jù)庫句柄處理方法運行的應用環(huán)境圖。如圖1所示,該應用環(huán)境包括終端110和服務器120,其中終端110、服務器120通過網(wǎng)絡(luò)進行通信。

終端110,可為智能手機、平板電腦、筆記本電腦、臺式計算機等,但并不局限于此。數(shù)據(jù)庫操作請求可以是終端110向本地數(shù)據(jù)庫或向服務器120發(fā)送的數(shù)據(jù)庫操作請求,也可以是服務器120向本地數(shù)據(jù)庫發(fā)送的數(shù)據(jù)庫操作請求。終端110或服務器120根據(jù)數(shù)據(jù)庫操作請求對應的數(shù)據(jù)庫操作類型和當前線程的狀態(tài)為數(shù)據(jù)庫操作請求返回對應的數(shù)據(jù)庫句柄。對于數(shù)據(jù)庫事務操作,可直接返回事務綁定的第一句柄,實現(xiàn)句柄在同一事務不同操作間的重用,對于當前線程中存在未完成句柄的情況,直接返回當前線程的未完成句柄,實現(xiàn)句柄在遞歸操作的不同操作間重用,可減少向句柄池申請獲取句柄的次數(shù),減少向句柄池申請獲取句柄時阻塞的發(fā)生,且無需每次操作都申請新的句柄,避免句柄冗余,減少內(nèi)存資源的消耗,減少句柄占用的文件占位符,避免大量數(shù)據(jù)庫操作情況下,句柄冗余導致數(shù)據(jù)庫甚至程序內(nèi)的所有文件都打開失敗的情形,提高了數(shù)據(jù)庫在使用過程中多線程并發(fā)的性能。

在一個實施例中,圖1中服務器120的內(nèi)部結(jié)構(gòu)如圖2所示,該服務器120包括通過系統(tǒng)總線連接的處理器、存儲介質(zhì)、內(nèi)存和網(wǎng)絡(luò)接口。其中,該服務器120的存儲介質(zhì)存儲有操作系統(tǒng)、數(shù)據(jù)庫、第一數(shù)據(jù)庫句柄處理裝置,數(shù)據(jù)庫用于存儲數(shù)據(jù),如存儲用戶數(shù)據(jù),第一數(shù)據(jù)庫句柄處理裝置用于實現(xiàn)一種適用于服務器120的數(shù)據(jù)庫句柄處理方法。該服務器120的處理器用于提供計算和控制能力,支撐整個服務器120的運行。該服務器120的內(nèi)存為存儲介質(zhì)中的第一數(shù)據(jù)庫句柄處理裝置的運行提供環(huán)境。該服務器120的網(wǎng)絡(luò)接口用于與外部的終端110通過網(wǎng)絡(luò)連接通信,比如接收終端110發(fā)送的數(shù)據(jù)庫操作請求、用戶行為數(shù)據(jù)等。

在一個實施例中,圖1中的終端110的內(nèi)部結(jié)構(gòu)如圖2所示,該終端110包括通過系統(tǒng)總線連接的處理器、圖形處理單元、存儲介質(zhì)、內(nèi)存、網(wǎng)絡(luò)接口、顯示屏幕和輸入設(shè)備。其中,終端110的存儲介質(zhì)存儲有操作系統(tǒng),還包括第二數(shù)據(jù)庫句柄處理裝置,該裝置用于實現(xiàn)一種適用于終端的數(shù)據(jù)庫句柄處理方法。該處理器用于提供計算和控制能力,支撐整個終端110的運行。終端110中的圖形處理單元用于至少提供顯示界面的繪制能力,內(nèi)存為存儲介質(zhì)中的第二數(shù)據(jù)庫句柄處理裝置的運行提供環(huán)境,網(wǎng)絡(luò)接口用于與服務器120進行網(wǎng)絡(luò)通信。顯示屏幕用于顯示應用界面等,如顯示即時通信界面,輸入設(shè)備用于接收用戶輸入的命令或數(shù)據(jù)等。對于帶觸摸屏的終端110,顯示屏幕和輸入設(shè)備可為觸摸屏。圖2和圖3中示出的結(jié)構(gòu),僅僅是與本申請方案相關(guān)的部分結(jié)構(gòu)的框圖,并不構(gòu)成對本申請方案所應用于其上的服務器或終端的限定,具體的服務器或終端可以包括比圖中所示更多或更少的部件,或者組合某些部件,或者具有不同的部件布置。

在一個實施例中,如圖4所示,提供了一種數(shù)據(jù)庫句柄處理方法,以應用于上述應用環(huán)境中的終端或服務器來舉例說明,包括以下步驟:

步驟s210,獲取數(shù)據(jù)庫操作請求,判斷數(shù)據(jù)庫操作請求對應的操作是否為事務操作,如果是,則進入步驟s220,否則進入步驟s230。

具體地,數(shù)據(jù)庫操作請求用于請求訪問數(shù)據(jù)庫訪問和對數(shù)據(jù)庫進行操作,數(shù)據(jù)庫操作包括普通操作、事務操作和遞歸操作等不同類型的操作。普通操作包括對數(shù)據(jù)庫的增加、刪除、查找、修改等單次操作,事務操作是對數(shù)據(jù)庫批量的增加、刪除、查找、修改等操作,在事務下為原子操作,只包括成功或失敗兩種結(jié)果,不會出現(xiàn)中間結(jié)果。與事務關(guān)聯(lián)的各個操作可分別通過不同的線程發(fā)送數(shù)據(jù)庫操作請求,與事務關(guān)聯(lián)的操作具有共同的目標,并且是相互依賴的,如果系統(tǒng)只執(zhí)行這些操作的一個子集,則可能會破壞事務的總體目標。對于一個事務關(guān)聯(lián)的各個操作,都采用相同的句柄,如果是事務操作則進入步驟s220。

步驟s220,獲取事務操作對應的事務綁定的第一句柄,返回第一句柄。

具體地,事務操作包括事務開始操作和事務結(jié)束操作,事務綁定的第一句柄是在事務開始操作時,從句柄池中通過句柄分發(fā)獲取第一句柄后,將第一句柄與事務相關(guān)聯(lián),實現(xiàn)第一句柄與事務的綁定。從而后續(xù)同一事務對應的其它操作都采用事務綁定的第一句柄,實現(xiàn)同一事務不同操作間句柄的重用。

在一個實施例中,數(shù)據(jù)庫操作請求對應的操作為事務的開始操作,方法還包括:從句柄池中通過句柄分發(fā)獲取第一句柄,將第一句柄與事務綁定。

具體地,會在事務開始時,即begintransaction成功時,獲得句柄的分發(fā),從句柄池中獲取第一句柄,同時將第一句柄與事務綁定,便于后續(xù)根據(jù)事務標識獲取第一句柄。

在一個實施例中,數(shù)據(jù)庫操作請求對應的操作為事務的結(jié)束操作,方法還包括:當結(jié)束操作執(zhí)行完畢,將第一句柄回收進入句柄池。

具體地,只有事務對應的所有事務操作都操作完畢,即commit或rollback時,才將與事務綁定的第一句柄回收進入句柄池,在事務對應的事務操作執(zhí)行過程中,即使其中一個操作執(zhí)行完畢,第一句柄也不會回收入句柄池,使得第一句柄只能被此事務對應的事務操作調(diào)用,不會被其它操作調(diào)用,避免了第一句柄進入句柄池后,此事務對應的下一個事務操作再次向句柄池申請第一句柄的步驟,同一事務的后續(xù)操作,都將直接返回第一句柄,能減少阻塞的發(fā)生,提高數(shù)據(jù)庫線程并發(fā)的性能。

步驟s230,判斷數(shù)據(jù)庫操作請求對應的當前線程中是否存在未完成句柄,如果是,則返回未完成句柄,如果不存在未完成句柄,則進入步驟s240。

具體的,未完成句柄是指上次從句柄池分發(fā)后,未回收進入句柄池中的句柄。遞歸操作會在第一個操作開始時獲得句柄的分發(fā),若在句柄回收之前沒有再次發(fā)起數(shù)據(jù)庫操作,則是一次普通操作,若發(fā)起了新的操作,則為遞歸操作。如對于遞歸操作,一次完整的遞歸操作包括多個子操作,如果只有其中的第一子操作完成,但是一次完整的數(shù)據(jù)庫操作未完成時,若在同一線程再次發(fā)起此完整的數(shù)據(jù)庫操作對應的第二子操作,則第一子操作時申請的句柄不回收入句柄池,相當于未完成句柄,第二子操作直接使用當前線程中的未完成句柄。實現(xiàn)句柄在遞歸操作的不同操作間重用,可減少向句柄池申請獲取句柄的次數(shù),減少向句柄池申請獲取句柄時阻塞的發(fā)生,且無需每次操作都申請新的句柄,避免句柄冗余,減少內(nèi)存資源的消耗。

步驟s240,從句柄池中通過句柄分發(fā)獲取第二句柄,返回第二句柄。

具體地,句柄池用于存儲可分發(fā)的句柄,句柄池中的句柄初始數(shù)量可根據(jù)需要自定義,如根據(jù)項目規(guī)模、用戶數(shù)量進行估算得出。句柄池的結(jié)構(gòu)可根據(jù)需要自定義,如表結(jié)構(gòu)、指針節(jié)點結(jié)構(gòu)、隊列結(jié)構(gòu)等。

本實施例中,通過獲取數(shù)據(jù)庫操作請求,判斷數(shù)據(jù)庫操作請求對應的操作是否為事務操作,如果是,則獲取事務操作對應的事務綁定的第一句柄,返回所述第一句柄,如果不是事務操作,則判斷數(shù)據(jù)庫操作請求對應的當前線程中是否存在未完成句柄,如果是,則返回未完成句柄,如果不存在未完成句柄,則從句柄池中通過句柄分發(fā)獲取第二句柄,返回第二句柄,對于數(shù)據(jù)庫事務操作,可直接返回事務綁定的第一句柄,實現(xiàn)句柄在同一事務不同操作間的重用,對于當前線程中存在未完成句柄的情況,直接返回當前線程的未完成句柄,實現(xiàn)句柄在遞歸操作的不同操作間重用,可減少向句柄池申請獲取句柄的次數(shù),減少向句柄池申請獲取句柄時阻塞的發(fā)生,且無需每次操作都申請新的句柄,避免句柄冗余,減少內(nèi)存資源的消耗,減少句柄占用的文件占位符,避免大量數(shù)據(jù)庫操作情況下,句柄冗余導致數(shù)據(jù)庫甚至程序內(nèi)的所有文件都打開失敗的情形,提高了數(shù)據(jù)庫在使用過程中多線程并發(fā)的性能。

在一個實施例中,數(shù)據(jù)庫操作請求對應的操作是遞歸操作,方法還包括:當遞歸操作對應的操作結(jié)束次數(shù)與操作開始次數(shù)相等時,將遞歸操作對應的句柄回收進入句柄池。

具體地,由于遞歸操作在同一個線程中進行多個子操作,整個完整的遞歸操作對應的多個子操作全部完成時,即操作結(jié)束次數(shù)與操作開始次數(shù)相等時,操作對稱時回收句柄。

在一個實施例中,數(shù)據(jù)庫操作請求對應的操作是普通數(shù)據(jù)庫操作,方法還包括:當普通數(shù)據(jù)庫操作結(jié)束時,將普通數(shù)據(jù)庫操作對應的句柄回收進入句柄池。

具體地,對于普通數(shù)據(jù)庫操作,在操作結(jié)束時就可將普通數(shù)據(jù)庫操作對應的句柄回收進入句柄池。而對于數(shù)據(jù)庫事務訪問的情況,句柄池不會在數(shù)據(jù)庫的其中一個事務操作結(jié)束后回收句柄,而是在事務的提交或回滾之后才進行回收。通過上述不同數(shù)據(jù)庫操作類型對應不同的句柄回收方式,與不同數(shù)據(jù)庫操作類型對應的句柄分發(fā)方式匹配,實現(xiàn)句柄的快速分發(fā),并在句柄分發(fā)的過程中避免句柄冗余,減少內(nèi)存資源的消耗,減少句柄占用的文件占位符,避免大量數(shù)據(jù)庫操作情況下,句柄冗余導致數(shù)據(jù)庫甚至程序內(nèi)的所有文件都打開失敗的情形,提高了數(shù)據(jù)庫在使用過程中多線程并發(fā)的性能。句柄池將一個句柄的分發(fā)和回收記為一個周期,這個周期可以是一個普通的數(shù)據(jù)庫操作、一次事務操作或一次遞歸操作對應的周期。

在一個實施例中,普通數(shù)據(jù)庫操作和/或遞歸操作對應的句柄保存在線程變量中,線程變量在各個線程都存在獨立的內(nèi)存。

具體地,每次普通操作或遞歸操作,都會將當前句柄保存在線程變量中,如thread_local的變量中,thread_local是c++的一個關(guān)鍵字,它聲明的變量將在每個線程都有一份獨立的內(nèi)存,可通過將內(nèi)存劃分為多個獨立的單元,各個獨立的單元用于保存不同的線程對應的線程變量,各線程的變量互不干涉。當操作未結(jié)束之前,再次發(fā)起操作時,句柄池將會直接從該線程變量中獲得句柄。由于其線程間互不干涉,因此無須加鎖保護,從而執(zhí)行效率更高,進一步提高了數(shù)據(jù)庫多線程并發(fā)的性能。

在一個實施例中,句柄池中的句柄組成隊列,隊列包括頭部和尾部,通過原子化的操作實現(xiàn)句柄的分發(fā)和回收。

具體地,句柄池的內(nèi)部是由一個隊列組成的,用于實現(xiàn)分發(fā)和回收兩個動作。分發(fā)和回收分別分布在頭部和尾部,以減少操作沖突,提高分發(fā)效率。句柄池的多線程并發(fā)不使用互斥鎖,而是使用原子訪問,這使得線程間不會因為鎖而進入休眠-喚醒的線程切換中,從而避免消耗大量cpu資源。原子化的操作是一種不可分割的操作,要么整體發(fā)生,要么根本不發(fā)生,即cas(compareandswap),是cpu的一個指令,它將變量a與b比較,若a與b相同,則將a賦值為c,表示為cas(a,b,c)。它的特點是,cpu確保該操作通過一個指令完成。原子訪問是cpu指令級別的操作,這類操作只有成功和失敗,沒有中間狀態(tài),可以避免多線程并發(fā)時,多個線程運行順序不一致導致的不確定后果。

在一個實施例中,將第一句柄回收進入句柄池的步驟包括:生成新句柄,將新句柄的next指針指向為空,在隊列的尾部指針指向的尾部句柄的next指針指向為空的條件下將尾部句柄的next指針指向所述新句柄,將隊列的尾部指針指向新句柄。

具體地,如圖5所示,隊列包括4個句柄,頭部指針指向的頭部句柄為句柄1,尾部指針指向的尾部句柄為句柄4,生成新句柄為句柄5,將句柄5的next指針指向為空。由于“將尾部句柄的next指針指向所述新句柄”為一條指令,“將隊列的尾部指針指向新句柄”為一條指令,這兩條操作指令的實現(xiàn)過程有兩步,當存在多線程并發(fā)時,可能出現(xiàn)線程1執(zhí)行完“句柄4的next指針指向句柄5”后,線程2執(zhí)行“將句柄4的next指針指向句柄5”,然后線程1再執(zhí)行“將隊列的尾部指針指向句柄5”的可能,執(zhí)行順序無法預知,從而限制只有當句柄4的next指針指向為空的條件下,才能將句柄4的next指針指向句柄5,即線程1執(zhí)行完“句柄4的next指針指向句柄5”后,線程2就無法執(zhí)行“將句柄4的next指針指向句柄5”了,因為此時句柄4的next指針指向不為空了,只有當線程1連續(xù)執(zhí)行完“將句柄4的next指針指向句柄5,將隊列的尾部指針指向句柄5”,線程2才能執(zhí)行“將尾部句柄的next指針指向新句柄”,因為此時尾部句柄已經(jīng)為句柄5,且句柄5的next指針指向為空,從而形成了原子操作,使得指令的執(zhí)行順序確定,保證了線程并發(fā)時,句柄回收的正確性。如圖6所示,為執(zhí)行完“將句柄4的next指針指向句柄5”之后隊列狀態(tài)示意圖,如圖7所示,為“將隊列的尾部指針指向句柄5”之后隊列狀態(tài)示意圖。

在一個實施例中,從句柄池中通過句柄分發(fā)獲取第二句柄的步驟包括:將隊列頭部指針指向從當前句柄移動至下一個句柄,即完成了從隊列頭部減少一個元素的操作,該操作只有一步,通過原子操作實現(xiàn)。然后將原來的頭部指針指向的句柄分發(fā)出去。當隊列內(nèi)沒有元素時,即頭部和尾部都指向空時,直接返回空。如圖8所示,為句柄分發(fā)前隊列狀態(tài)示意圖,如圖9所示,為將隊列頭部指針指向從當前句柄1移動至下一個句柄2后隊列狀態(tài)示意圖,如圖10所示,為將當前句柄1分發(fā)出去后得到的隊列狀態(tài)示意圖。

在一個實施例中,數(shù)據(jù)庫操作請求包括多個并發(fā)的寫操作請求,結(jié)合圖11所示,方法還包括:

步驟s310,第一線程向數(shù)據(jù)庫發(fā)送鎖請求,獲取鎖成功,將數(shù)據(jù)庫鎖定。

具體地,對于寫操作并發(fā)這種必須互斥的情況,當線程1在進行寫操作前,第一線程向數(shù)據(jù)庫發(fā)送鎖請求,鎖請求中攜帶線程1期望的鎖狀態(tài),數(shù)據(jù)庫判斷當前狀態(tài)符合線程1期望的鎖狀態(tài),從而線程1獲取鎖成功,將數(shù)據(jù)庫鎖定,開始進行寫操作,當線程1進行寫操作時,線程2的寫操作訪問會被阻塞。

步驟s320,第二線程向數(shù)據(jù)庫發(fā)送鎖請求,獲取鎖失敗,將第二線程期望的鎖狀態(tài)插入鎖狀態(tài)隊列,第二線程進入等待狀態(tài)。

具體地,由于線程1將數(shù)據(jù)庫鎖定,第二線程向數(shù)據(jù)庫發(fā)送鎖請求也不能獲取鎖,將第二線程期望的鎖狀態(tài)插入鎖狀態(tài)隊列。鎖狀態(tài)隊列用于存儲各個并發(fā)線程期望的鎖狀態(tài),是一個先進先出的隊列,如存在先進入的第一鎖狀態(tài)和后進入的第二鎖狀態(tài),在上一個寫操作完成后,先判斷當前數(shù)據(jù)庫狀態(tài)是否符合第一鎖狀態(tài),從而在當前數(shù)據(jù)庫狀態(tài)符合第一鎖狀態(tài)時,優(yōu)先進入第一鎖狀態(tài)對應的線程的喚醒重試流程。將第二線程期望的鎖狀態(tài)插入鎖狀態(tài)隊列后,第二線程進入休眠等待狀態(tài)。

步驟s330,第一線程完成寫操作,將數(shù)據(jù)庫解鎖,判斷數(shù)據(jù)庫當前狀態(tài)是否滿足第二線程期望的鎖狀態(tài),如果滿足,則喚醒第二線程進行寫操作重試。

具體地,第一線程完成寫操作,將數(shù)據(jù)庫解鎖,解鎖后,會在線程1比較當前數(shù)據(jù)庫狀態(tài)與鎖狀態(tài)隊列中的第一個狀態(tài),即與第二線程期望的鎖狀態(tài)是否匹配,若匹配,則會通過signal喚醒對應的第二線程進行重試操作。如果第二線程期望的鎖狀態(tài)不是鎖狀態(tài)隊列中的第一個狀態(tài),則需要等待鎖狀態(tài)隊列中前面的其他線程期望的鎖狀態(tài)依次與當前數(shù)據(jù)庫狀態(tài)匹配判斷是否滿足喚醒條件。

本實施例中,通過將線程期望的鎖狀態(tài)存入鎖狀態(tài)隊列,在上一個獲取鎖的寫操作完成后可立即根據(jù)鎖狀態(tài)隊列中的線程期望的鎖狀態(tài)判斷是否可喚醒其它線程重試寫操作,而不是通過定時重試的方式,這使得線程不必多次進入線程切換,可大大減少線程切換的次數(shù),同時,在能夠重試成功時,線程會第一時間被喚醒,而不至于空等待,能在解鎖的第一時間通知到對應的線程。

在一個實施例中,步驟s320中將第二線程期望的鎖狀態(tài)插入鎖狀態(tài)隊列的步驟包括:當?shù)诙€程是主線程時,將鎖狀態(tài)插入至鎖狀態(tài)隊列的頭部。

具體地,當一個程序啟動時,就有一個進程被操作系統(tǒng)創(chuàng)建,與此同時一個線程也立刻運行,該線程通常叫做程序的主線程。一般程序的交互、動畫展示均在主線程運行,若主線程被卡住,則會導致動畫卡頓、操作無響應。當即將進入休眠的線程為主線程時,主線程所期望的鎖狀態(tài)會插隊到隊列的第一位,從而在下次解鎖時,主線程可以第一時間被喚醒,使其擁有較高的優(yōu)先級被喚醒,從而減少主線程,即界面阻塞的時間,大大減少了界面無響應的卡頓現(xiàn)象。

在一個實施例中,如圖12所示,提供了一種數(shù)據(jù)庫句柄處理裝置,包括:

第一判斷模塊410,用于獲取數(shù)據(jù)庫操作請求,判斷數(shù)據(jù)庫操作請求對應的操作是否為事務操作,如果是,則進入第一句柄返回模塊420,否則進入第二判斷模塊430。

第一句柄返回模塊420,用于獲取事務操作對應的事務綁定的第一句柄,返回所述第一句柄。

第二判斷模塊430,用于判斷數(shù)據(jù)庫操作請求對應的當前線程中是否存在未完成句柄,如果是,則返回未完成句柄,否則進入第二句柄返回模塊440。

第二句柄返回模塊440,用于從句柄池中通過句柄分發(fā)獲取第二句柄,返回所述第二句柄。

在一個實施例中,數(shù)據(jù)庫操作請求對應的操作為事務的開始操作,如圖13所示,裝置還包括:

綁定模塊450,用于從句柄池中通過句柄分發(fā)獲取第一句柄,將第一句柄與事務綁定。

在一個實施例中,數(shù)據(jù)庫操作請求對應的操作為事務的結(jié)束操作,如圖14所示,裝置還包括:

第一回收模塊460,用于當結(jié)束操作執(zhí)行完畢,將第一句柄回收進入句柄池。

在一個實施例中,數(shù)據(jù)庫操作請求對應的操作是遞歸操作,如圖15所示,裝置還包括:

第二回收模塊470,用于當遞歸操作對應的操作結(jié)束次數(shù)與操作開始次數(shù)相等時,將遞歸操作對應的句柄回收進入句柄池。

在一個實施例中,所述裝置還包括內(nèi)存,內(nèi)存包括多個獨立的單元,各個獨立的單元用于保存不同的線程對應的線程變量,線程變量用于保存普通數(shù)據(jù)庫操作和/或遞歸操作對應的句柄。

在一個實施例中,所述裝置還包括由句柄組成隊列的句柄池,隊列包括頭部和尾部,頭部和尾部用于接收原子化的操作實現(xiàn)句柄的分發(fā)和回收。

在一個實施例中,第一回收模塊450或第二回收模塊470還用于生成新句柄,將新句柄的next指針指向為空,將隊列的尾部指針指向的尾部句柄的next指針指向新句柄,將隊列的尾部指針指向新句柄。

在一個實施例中,數(shù)據(jù)庫操作請求包括多個并發(fā)的寫操作請求,如圖16所示,裝置還包括:

寫操作通知模塊480,用于第一線程向數(shù)據(jù)庫發(fā)送鎖請求,獲取鎖成功,將數(shù)據(jù)庫鎖定,第二線程向數(shù)據(jù)庫發(fā)送鎖請求,獲取鎖失敗,將第二線程期望的鎖狀態(tài)插入鎖狀態(tài)隊列,第二線程進入等待狀態(tài),第一線程完成寫操作,將數(shù)據(jù)庫解鎖,判斷數(shù)據(jù)庫當前狀態(tài)是否滿足第二線程期望的鎖狀態(tài),如果滿足,則喚醒第二線程進行寫操作重試。

在一個具體的實施例中,數(shù)據(jù)庫為sqlite,sqlite是一款輕型的數(shù)據(jù)庫,是遵守acid的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),通過獨立的句柄池對sqlite句柄進行各線程地分發(fā),減少阻塞的發(fā)生。對于必須通過互斥鎖保護的共享資源,也通過鎖狀態(tài)隊列做到了及時的通知機制,使得等待線程第一時間能獲得解鎖的通知。同時,通過獲取事務操作對應的事務綁定的句柄和當數(shù)據(jù)庫操作請求對應的當前線程中存在未完成句柄時,返回未完成句柄,實現(xiàn)了對sqlite事務和句柄的遞歸調(diào)用的無鎖優(yōu)化,從而大大地提高了sqlite在使用過程中的多線程并發(fā)性能。將包括了上述數(shù)據(jù)庫句柄處理方法的sqlite應用于即時通信應用中,如微信中,即時通信應用中的消息數(shù)據(jù)庫可以多線程高效并發(fā)地收發(fā)消息,同時還能在后臺進行數(shù)據(jù)遷移的操作,如圖17所示為即時通信應用中并發(fā)收發(fā)消息同時在后臺進行數(shù)據(jù)遷移的界面示意圖。

在一個實施例中,提供了一種計算機設(shè)備,包括存儲器和處理器,存儲器中存儲有計算機可讀指令,計算機可讀指令被所述處理器執(zhí)行時,使得所述處理器執(zhí)行以下步驟:獲取數(shù)據(jù)庫操作請求,判斷數(shù)據(jù)庫操作請求對應的操作是否為事務操作,如果是,則獲取事務操作對應的事務綁定的第一句柄,返回第一句柄,如果不是事務操作,則判斷數(shù)據(jù)庫操作請求對應的當前線程中是否存在未完成句柄,如果是,則返回未完成句柄,如果不存在未完成句柄,則從句柄池中通過句柄分發(fā)獲取第二句柄,返回第二句柄。

上述計算機設(shè)備,通過獲取數(shù)據(jù)庫操作請求,判斷數(shù)據(jù)庫操作請求對應的操作是否為事務操作,如果是,則獲取事務操作對應的事務綁定的第一句柄,返回所述第一句柄,如果不是事務操作,則判斷數(shù)據(jù)庫操作請求對應的當前線程中是否存在未完成句柄,如果是,則返回未完成句柄,如果不存在未完成句柄,則從句柄池中通過句柄分發(fā)獲取第二句柄,返回第二句柄,對于數(shù)據(jù)庫事務操作,可直接返回事務綁定的第一句柄,實現(xiàn)句柄在同一事務不同操作間的重用,對于當前線程中存在未完成句柄的情況,直接返回當前線程的未完成句柄,實現(xiàn)句柄在遞歸操作的不同操作間重用,可減少向句柄池申請獲取句柄的次數(shù),減少向句柄池申請獲取句柄時阻塞的發(fā)生,且無需每次操作都申請新的句柄,避免句柄冗余,減少內(nèi)存資源的消耗,減少句柄占用的文件占位符,避免大量數(shù)據(jù)庫操作情況下,句柄冗余導致數(shù)據(jù)庫甚至程序內(nèi)的所有文件都打開失敗的情形,提高了數(shù)據(jù)庫在使用過程中多線程并發(fā)的性能。

在一個實施例中,數(shù)據(jù)庫操作請求對應的操作為事務的開始操作,計算機可讀指令還使得處理器執(zhí)行以下步驟:從句柄池中通過句柄分發(fā)獲取第一句柄,將第一句柄與事務綁定。

在一個實施例中,數(shù)據(jù)庫操作請求對應的操作為所述事務的結(jié)束操作,計算機可讀指令還使得處理器執(zhí)行以下步驟:當結(jié)束操作執(zhí)行完畢,將第一句柄回收進入句柄池。

在一個實施例中,數(shù)據(jù)庫操作請求對應的操作是遞歸操作,計算機可讀指令還使得處理器執(zhí)行以下步驟:當遞歸操作對應的操作結(jié)束次數(shù)與操作開始次數(shù)相等時,將遞歸操作對應的句柄回收進入句柄池。

在一個實施例中,數(shù)據(jù)庫操作請求對應的操作是普通數(shù)據(jù)庫操作,計算機可讀指令還使得處理器執(zhí)行以下步驟:當普通數(shù)據(jù)庫操作結(jié)束時,將普通數(shù)據(jù)庫操作對應的句柄回收進入句柄池。

在一個實施例中,普通數(shù)據(jù)庫操作和/或遞歸操作對應的句柄保存在線程變量中,線程變量在各個線程都存在獨立的內(nèi)存。

在一個實施例中,句柄池中的句柄組成隊列,隊列包括頭部和尾部,通過原子化的操作實現(xiàn)句柄的分發(fā)和回收。

在一個實施例中,處理器所執(zhí)行的將所述第一句柄回收進入句柄池包括:生成新句柄,將新句柄的next指針指向為空;將隊列的尾部指針指向的尾部句柄的next指針指向新句柄;將隊列的尾部指針指向新句柄。

在一個實施例中,數(shù)據(jù)庫操作請求包括多個并發(fā)的寫操作請求,計算機可讀指令還使得處理器執(zhí)行以下步驟:第一線程向數(shù)據(jù)庫發(fā)送鎖請求,獲取鎖成功,將數(shù)據(jù)庫鎖定,第二線程向數(shù)據(jù)庫發(fā)送鎖請求,獲取鎖失敗,將第二線程期望的鎖狀態(tài)插入鎖狀態(tài)隊列,第二線程進入等待狀態(tài),第一線程完成寫操作,將數(shù)據(jù)庫解鎖,判斷數(shù)據(jù)庫當前狀態(tài)是否滿足第二線程期望的鎖狀態(tài),如果滿足,則喚醒第二線程進行寫操作重試。

在一個實施例中,處理器所執(zhí)行的將第二線程期望的鎖狀態(tài)插入所述鎖狀態(tài)隊列包括:當?shù)诙€程是是主線程時,將鎖狀態(tài)插入至鎖狀態(tài)隊列的頭部。

在一個實施例中,提供了一個或多個存儲有計算機可讀指令的非易失性可讀存儲介質(zhì),該計算機可讀指令被一個或多個處理器執(zhí)行時,使得一個或多個處理器執(zhí)行以下步驟:獲取數(shù)據(jù)庫操作請求,判斷數(shù)據(jù)庫操作請求對應的操作是否為事務操作,如果是,則獲取事務操作對應的事務綁定的第一句柄,返回第一句柄,如果不是事務操作,則判斷數(shù)據(jù)庫操作請求對應的當前線程中是否存在未完成句柄,如果是,則返回未完成句柄,如果不存在未完成句柄,則從句柄池中通過句柄分發(fā)獲取第二句柄,返回第二句柄。

上述非易失性可讀存儲介質(zhì)中的計算機可讀指令被處理器執(zhí)行時,通過獲取數(shù)據(jù)庫操作請求,判斷數(shù)據(jù)庫操作請求對應的操作是否為事務操作,如果是,則獲取事務操作對應的事務綁定的第一句柄,返回所述第一句柄,如果不是事務操作,則判斷數(shù)據(jù)庫操作請求對應的當前線程中是否存在未完成句柄,如果是,則返回未完成句柄,如果不存在未完成句柄,則從句柄池中通過句柄分發(fā)獲取第二句柄,返回第二句柄,對于數(shù)據(jù)庫事務操作,可直接返回事務綁定的第一句柄,實現(xiàn)句柄在同一事務不同操作間的重用,對于當前線程中存在未完成句柄的情況,直接返回當前線程的未完成句柄,實現(xiàn)句柄在遞歸操作的不同操作間重用,可減少向句柄池申請獲取句柄的次數(shù),減少向句柄池申請獲取句柄時阻塞的發(fā)生,且無需每次操作都申請新的句柄,避免句柄冗余,減少內(nèi)存資源的消耗,減少句柄占用的文件占位符,避免大量數(shù)據(jù)庫操作情況下,句柄冗余導致數(shù)據(jù)庫甚至程序內(nèi)的所有文件都打開失敗的情形,提高了數(shù)據(jù)庫在使用過程中多線程并發(fā)的性能。

在一個實施例中,數(shù)據(jù)庫操作請求對應的操作為事務的開始操作,計算機可讀指令還使得處理器執(zhí)行以下步驟:從句柄池中通過句柄分發(fā)獲取第一句柄,將第一句柄與事務綁定。

在一個實施例中,數(shù)據(jù)庫操作請求對應的操作為所述事務的結(jié)束操作,計算機可讀指令還使得處理器執(zhí)行以下步驟:當結(jié)束操作執(zhí)行完畢,將第一句柄回收進入句柄池。

在一個實施例中,數(shù)據(jù)庫操作請求對應的操作是遞歸操作,計算機可讀指令還使得處理器執(zhí)行以下步驟:當遞歸操作對應的操作結(jié)束次數(shù)與操作開始次數(shù)相等時,將遞歸操作對應的句柄回收進入句柄池。

在一個實施例中,數(shù)據(jù)庫操作請求對應的操作是普通數(shù)據(jù)庫操作,計算機可讀指令還使得處理器執(zhí)行以下步驟:當普通數(shù)據(jù)庫操作結(jié)束時,將普通數(shù)據(jù)庫操作對應的句柄回收進入句柄池。

在一個實施例中,普通數(shù)據(jù)庫操作和/或遞歸操作對應的句柄保存在線程變量中,線程變量在各個線程都存在獨立的內(nèi)存。

在一個實施例中,句柄池中的句柄組成隊列,隊列包括頭部和尾部,通過原子化的操作實現(xiàn)句柄的分發(fā)和回收。

在一個實施例中,處理器所執(zhí)行的將所述第一句柄回收進入句柄池包括:生成新句柄,將新句柄的next指針指向為空;將隊列的尾部指針指向的尾部句柄的next指針指向新句柄;將隊列的尾部指針指向新句柄。

在一個實施例中,數(shù)據(jù)庫操作請求包括多個并發(fā)的寫操作請求,計算機可讀指令還使得處理器執(zhí)行以下步驟:第一線程向數(shù)據(jù)庫發(fā)送鎖請求,獲取鎖成功,將數(shù)據(jù)庫鎖定,第二線程向數(shù)據(jù)庫發(fā)送鎖請求,獲取鎖失敗,將第二線程期望的鎖狀態(tài)插入鎖狀態(tài)隊列,第二線程進入等待狀態(tài),第一線程完成寫操作,將數(shù)據(jù)庫解鎖,判斷數(shù)據(jù)庫當前狀態(tài)是否滿足第二線程期望的鎖狀態(tài),如果滿足,則喚醒第二線程進行寫操作重試。

在一個實施例中,處理器所執(zhí)行的將第二線程期望的鎖狀態(tài)插入所述鎖狀態(tài)隊列包括:當?shù)诙€程是是主線程時,將鎖狀態(tài)插入至鎖狀態(tài)隊列的頭部。

本領(lǐng)域普通技術(shù)人員可以理解實現(xiàn)上述實施例方法中的全部或部分流程,是可以通過計算機程序來指令相關(guān)的硬件來完成,所述程序可存儲于一計算機可讀取存儲介質(zhì)中,如本發(fā)明實施例中,該程序可存儲于計算機系統(tǒng)的存儲介質(zhì)中,并被該計算機系統(tǒng)中的至少一個處理器執(zhí)行,以實現(xiàn)包括如上述各方法的實施例的流程。其中,所述存儲介質(zhì)可為磁碟、光盤、只讀存儲記憶體(read-onlymemory,rom)或隨機存儲記憶體(randomaccessmemory,ram)等。

以上所述實施例的各技術(shù)特征可以進行任意的組合,為使描述簡潔,未對上述實施例中的各個技術(shù)特征所有可能的組合都進行描述,然而,只要這些技術(shù)特征的組合不存在矛盾,都應當認為是本說明書記載的范圍。

以上所述實施例僅表達了本發(fā)明的幾種實施方式,其描述較為具體和詳細,但并不能因此而理解為對發(fā)明專利范圍的限制。應當指出的是,對于本領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明構(gòu)思的前提下,還可以做出若干變形和改進,這些都屬于本發(fā)明的保護范圍。因此,本發(fā)明專利的保護范圍應以所附權(quán)利要求為準。

當前第1頁1 2 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1