本申請(qǐng)涉及計(jì)算機(jī)應(yīng)用技術(shù)領(lǐng)域,尤其涉及一種數(shù)據(jù)庫(kù)訪問(wèn)方法及裝置。
背景技術(shù):
在JAVA環(huán)境中,每個(gè)線程都會(huì)消耗內(nèi)存,如果同時(shí)運(yùn)行的線程數(shù)量過(guò)多,會(huì)對(duì)系統(tǒng)的性能造成較大影響,因此,在基于JAVA開發(fā)的Web應(yīng)用中,一般對(duì)會(huì)為應(yīng)用服務(wù)器設(shè)定線程池,通過(guò)限定線程數(shù)量的方式來(lái)保證應(yīng)用服務(wù)器的性能。
根據(jù)現(xiàn)有的數(shù)據(jù)庫(kù)訪問(wèn)方法,應(yīng)用服務(wù)器接收到用戶側(cè)的數(shù)據(jù)訪問(wèn)請(qǐng)求后,需要為該請(qǐng)求分配處理線程,而且從應(yīng)用服務(wù)器向數(shù)據(jù)庫(kù)側(cè)發(fā)起數(shù)據(jù)訪問(wèn)請(qǐng)求后、直到數(shù)據(jù)庫(kù)返回?cái)?shù)據(jù)這段時(shí)間內(nèi),該線程是一直被占用的。這樣,數(shù)據(jù)庫(kù)的內(nèi)部處理的速度就會(huì)在很大程度上影響到應(yīng)用服務(wù)器的線程占用情況,一旦數(shù)據(jù)庫(kù)出現(xiàn)問(wèn)題、響應(yīng)速度變慢,很容易導(dǎo)致應(yīng)用服務(wù)器的線程耗盡,從而降低應(yīng)用服務(wù)器的實(shí)際業(yè)務(wù)處理能力。
技術(shù)實(shí)現(xiàn)要素:
針對(duì)上述技術(shù)問(wèn)題,本申請(qǐng)?zhí)峁┮环N數(shù)據(jù)庫(kù)訪問(wèn)方法及裝置,技術(shù)方案如下:
根據(jù)本申請(qǐng)的第一方面,提供一種數(shù)據(jù)庫(kù)訪問(wèn)方法,該方法包括:
接收用戶側(cè)發(fā)送的用戶訪問(wèn)請(qǐng)求;
根據(jù)接收到的用戶訪問(wèn)請(qǐng)求,使用NIO方式向數(shù)據(jù)庫(kù)側(cè)發(fā)送數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求;
確認(rèn)所述數(shù)據(jù)訪問(wèn)請(qǐng)求發(fā)送成功后,生成數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求任務(wù),并將該任務(wù)添加至工作隊(duì)列,所述數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求任務(wù)中,攜帶有本次用戶訪問(wèn)請(qǐng)求標(biāo)識(shí)以及數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求標(biāo)識(shí);
釋放當(dāng)前的處理線程。
根據(jù)本申請(qǐng)的第二方面,提供一種數(shù)據(jù)庫(kù)訪問(wèn)裝置,該裝置包括:
用戶訪問(wèn)請(qǐng)求接收模塊,用于接收用戶側(cè)發(fā)送的用戶訪問(wèn)請(qǐng)求;
數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求發(fā)送模塊,用于根據(jù)接收到的用戶訪問(wèn)請(qǐng)求,使用NIO方式向數(shù)據(jù)庫(kù)側(cè)發(fā)送數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求;
數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求任務(wù)添加模塊,用于在確認(rèn)所述數(shù)據(jù)訪問(wèn)請(qǐng)求發(fā)送成功后,生成數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求任務(wù),并將該任務(wù)添加至工作隊(duì)列,所述數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求任務(wù)中,攜帶有本次用戶訪問(wèn)請(qǐng)求標(biāo)識(shí)以及數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求標(biāo)識(shí);
線程釋放模塊,用于釋放當(dāng)前的處理線程。
本申請(qǐng)所提供的技術(shù)方案,應(yīng)用服務(wù)器使用異步IO模式處理向數(shù)據(jù)庫(kù)的訪問(wèn)請(qǐng)求,同時(shí)使用任務(wù)隊(duì)列來(lái)保存應(yīng)用服務(wù)器與數(shù)據(jù)庫(kù)之間的連接,使連接不與線程綁定,這樣,應(yīng)用服務(wù)器在向數(shù)據(jù)庫(kù)發(fā)送訪問(wèn)請(qǐng)求后,處理線程就可以被釋放,數(shù)據(jù)庫(kù)的響應(yīng)耗時(shí)階段無(wú)需占用應(yīng)用服務(wù)器的線程,從而不會(huì)導(dǎo)致線程耗盡而影響到應(yīng)用服務(wù)器的實(shí)際業(yè)務(wù)處理能力,也使得應(yīng)用服務(wù)器的CPU資源可以充分用來(lái)處理業(yè)務(wù)。
應(yīng)當(dāng)理解的是,以上的一般描述和后文的細(xì)節(jié)描述僅是示例性和解釋性的,并不能限制本申請(qǐng)。
附圖說(shuō)明
為了更清楚地說(shuō)明本申請(qǐng)實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見(jiàn)地,下面描述中的附圖僅僅是本申請(qǐng)中記載的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來(lái)講,還可以根據(jù)這些附圖獲得其他的附圖。
圖1是現(xiàn)有技術(shù)的數(shù)據(jù)庫(kù)訪問(wèn)方法的流程示意圖;
圖2是本申請(qǐng)的數(shù)據(jù)庫(kù)訪問(wèn)方法的訪問(wèn)階段流程示意圖;
圖3是本申請(qǐng)的數(shù)據(jù)庫(kù)訪問(wèn)方法的響應(yīng)階段流程示意圖;
圖4是本申請(qǐng)的數(shù)據(jù)庫(kù)訪問(wèn)方法的完整流程示意圖;
圖5是本申請(qǐng)的數(shù)據(jù)庫(kù)訪問(wèn)裝置的第一種結(jié)構(gòu)示意圖;
圖6是本申請(qǐng)的數(shù)據(jù)庫(kù)訪問(wèn)裝置的第二種結(jié)構(gòu)示意圖。
具體實(shí)施方式
根據(jù)現(xiàn)有技術(shù)的實(shí)現(xiàn)方案,應(yīng)用服務(wù)器都是采用同步調(diào)用的方式與數(shù)據(jù)庫(kù)進(jìn)行交互,如圖1所示,應(yīng)用服務(wù)器需要為用戶側(cè)發(fā)來(lái)的每個(gè)訪問(wèn)請(qǐng)求分配處理線程,而且從應(yīng)用服務(wù)器向數(shù)據(jù)庫(kù)(DB)側(cè)發(fā)起數(shù)據(jù)訪問(wèn)請(qǐng)求后、直到數(shù)據(jù)庫(kù)返回?cái)?shù)據(jù)這段時(shí)間內(nèi),該線程是一直被占用的。
假設(shè)在一次數(shù)據(jù)讀取過(guò)程中,數(shù)據(jù)庫(kù)平均耗時(shí)為200毫秒,在忽略應(yīng)用服務(wù)器內(nèi)部處理、數(shù)據(jù)交互等其他時(shí)間占用的情況下,可以近似認(rèn)為每個(gè)線程需要被占用200毫秒,也就是說(shuō)1個(gè)線程最多能夠在1秒內(nèi)處理5個(gè)線程。如果應(yīng)用服務(wù)器的設(shè)計(jì)需求是每秒能夠支撐500次的訪問(wèn)量,可以將線程池的大小設(shè)置為100。但是,一旦數(shù)據(jù)庫(kù)出現(xiàn)問(wèn)題,例如某段時(shí)間內(nèi)平均耗時(shí)從200毫秒上升到1秒,那么100次/秒的請(qǐng)求量就會(huì)將應(yīng)用服務(wù)器的線程耗盡,導(dǎo)致應(yīng)用服務(wù)器可支撐的訪問(wèn)量從500次/秒下降到100次/秒,業(yè)務(wù)處理能力嚴(yán)重下降。并且,此時(shí)應(yīng)用服務(wù)器的CPU等其他資源并沒(méi)有達(dá)到使用上限,因此資源浪費(fèi)問(wèn)題也比較嚴(yán)重。
針對(duì)上述問(wèn)題,本申請(qǐng)?zhí)岢龅姆桨甘牵簯?yīng)用服務(wù)器使用異步IO模式處理向數(shù)據(jù)庫(kù)的訪問(wèn)請(qǐng)求,同時(shí)使用任務(wù)隊(duì)列來(lái)保存應(yīng)用服務(wù)器與數(shù)據(jù)庫(kù)之間的連接,使連接不與線程綁定,這樣,應(yīng)用服務(wù)器在向數(shù)據(jù)庫(kù)發(fā)送訪問(wèn)請(qǐng)求后,處理線程就可以被釋放,數(shù)據(jù)庫(kù)的響應(yīng)耗時(shí)階段無(wú)需占用應(yīng)用服務(wù)器的線程,從而不會(huì)導(dǎo)致線程耗盡而影響到應(yīng)用服務(wù)器的實(shí)際業(yè)務(wù)處理能力。
為了使本領(lǐng)域技術(shù)人員更好地理解本申請(qǐng)中的技術(shù)方案,下面將結(jié)合本申請(qǐng)實(shí)施例中的附圖,對(duì)本申請(qǐng)實(shí)施例中的技術(shù)方案進(jìn)行詳細(xì)地描述,顯然,所 描述的實(shí)施例僅僅是本申請(qǐng)一部分實(shí)施例,而不是全部的實(shí)施例?;诒旧暾?qǐng)中的實(shí)施例,本領(lǐng)域普通技術(shù)人員所獲得的所有其他實(shí)施例,都應(yīng)當(dāng)屬于本申請(qǐng)保護(hù)的范圍。
圖2所示,為本申請(qǐng)?zhí)峁┑臄?shù)據(jù)訪問(wèn)請(qǐng)求方法的流程圖,該方法可以由應(yīng)用服務(wù)器執(zhí)行,包括以下步驟:
S101,接收用戶側(cè)發(fā)送的用戶訪問(wèn)請(qǐng)求;
S102,根據(jù)接收到的用戶訪問(wèn)請(qǐng)求,使用NIO方式向數(shù)據(jù)庫(kù)側(cè)發(fā)送數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求;
應(yīng)用服務(wù)器根據(jù)用戶的訪問(wèn)內(nèi)容,先確定目標(biāo)數(shù)據(jù)庫(kù)/表,構(gòu)建數(shù)據(jù)訪問(wèn)指令,然后與目標(biāo)數(shù)據(jù)庫(kù)設(shè)備建立長(zhǎng)連接,通過(guò)長(zhǎng)連接發(fā)送數(shù)據(jù)訪問(wèn)指令。
S103,確認(rèn)數(shù)據(jù)訪問(wèn)請(qǐng)求發(fā)送成功后,生成數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求任務(wù),并將該任務(wù)添加至工作隊(duì)列。
在所生成的數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求任務(wù)中,需要攜帶以下信息:
本次數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求的標(biāo)識(shí),作用是在數(shù)據(jù)庫(kù)返回訪問(wèn)結(jié)果后,從任務(wù)隊(duì)列中找到對(duì)應(yīng)的任務(wù)。
本次用戶訪問(wèn)請(qǐng)求的標(biāo)識(shí),作用是在數(shù)據(jù)庫(kù)返回訪問(wèn)結(jié)果后,根據(jù)“數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求”與“用戶訪問(wèn)請(qǐng)求”的綁定關(guān)系,確定相應(yīng)的用戶訪問(wèn)請(qǐng)求信息
攜帶有本次用戶訪問(wèn)請(qǐng)求標(biāo)識(shí)以及數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求標(biāo)識(shí);
S104,釋放當(dāng)前的處理線程。
NIO是在JAVA1.4版本中提供的一種可以替代標(biāo)準(zhǔn)Java IO API的IO API,與標(biāo)準(zhǔn)IO相比,NIO能夠支持異步IO模式。在本申請(qǐng)所提供的方案中,應(yīng)用服務(wù)器使用異步IO模式處理向數(shù)據(jù)庫(kù)的訪問(wèn)請(qǐng)求,同時(shí)使用任務(wù)隊(duì)列來(lái)保存應(yīng)用服務(wù)器與數(shù)據(jù)庫(kù)之間的連接信息?;贜IO的特性,應(yīng)用服務(wù)器向數(shù)據(jù)庫(kù)發(fā)送完數(shù)據(jù)訪問(wèn)請(qǐng)求后,就可以釋放當(dāng)前的處理線程,不需要設(shè)置線程對(duì)數(shù)據(jù)庫(kù)側(cè)進(jìn)行監(jiān)聽(tīng)。當(dāng)數(shù)據(jù)庫(kù)耗時(shí)上升時(shí),只會(huì)增加工作隊(duì)列中的任務(wù)數(shù)量,對(duì)應(yīng)用服務(wù)器的線程占用沒(méi)有影響,也不會(huì)導(dǎo)致應(yīng)用服務(wù)器業(yè)務(wù)處理能力的降低。另一方面,也使得應(yīng)用服務(wù)器的CPU資源可以充分用來(lái)處理業(yè)務(wù)。
在本申請(qǐng)的一種改進(jìn)實(shí)施方式中,應(yīng)用服務(wù)器與用戶側(cè)的交互也可以使用NIO方式,具體而言,在S101~S102,應(yīng)用服務(wù)器使用NIO方式接收用戶側(cè)發(fā)送的用戶訪問(wèn)請(qǐng)求;根據(jù)接收到的用戶訪問(wèn)請(qǐng)求,生成用戶訪問(wèn)請(qǐng)求任務(wù),并將該任務(wù)添加至工作隊(duì)列;后續(xù)將從工作隊(duì)列中獲取用戶訪問(wèn)請(qǐng)求任務(wù),然后針對(duì)所獲取的用戶訪問(wèn)請(qǐng)求任務(wù),使用NIO方式向數(shù)據(jù)庫(kù)側(cè)發(fā)送數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求。
在上述數(shù)據(jù)訪問(wèn)請(qǐng)求方法的基礎(chǔ)上,本申請(qǐng)還進(jìn)一步提供數(shù)據(jù)訪問(wèn)響應(yīng)的方法,該方法由應(yīng)用服務(wù)器執(zhí)行,參見(jiàn)圖3所示,該方法可以包括以下步驟:
S201,使用NIO方式接收數(shù)據(jù)庫(kù)側(cè)發(fā)送的數(shù)據(jù)庫(kù)訪問(wèn)響應(yīng);
S202,根據(jù)數(shù)據(jù)庫(kù)訪問(wèn)響應(yīng)中攜帶的數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求標(biāo)識(shí),從工作隊(duì)列中獲取具有相同標(biāo)識(shí)的數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求任務(wù);
S203,根據(jù)所獲取的數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求任務(wù)中所攜帶的用戶訪問(wèn)請(qǐng)求標(biāo)識(shí),向用戶側(cè)發(fā)送用戶訪問(wèn)響應(yīng)。
根據(jù)本申請(qǐng)所前面提供的數(shù)據(jù)訪問(wèn)請(qǐng)求方法,使用任務(wù)隊(duì)列來(lái)保存應(yīng)用服務(wù)器與數(shù)據(jù)庫(kù)之間的連接信息,應(yīng)用服務(wù)器向數(shù)據(jù)庫(kù)發(fā)送完數(shù)據(jù)訪問(wèn)請(qǐng)求后,就可以釋放處理線程,而不需要設(shè)置線程對(duì)數(shù)據(jù)庫(kù)側(cè)進(jìn)行監(jiān)聽(tīng)。而當(dāng)數(shù)據(jù)庫(kù)向應(yīng)用服務(wù)器返回訪問(wèn)結(jié)果后,應(yīng)用服務(wù)器首先根據(jù)數(shù)據(jù)庫(kù)訪問(wèn)響應(yīng)中攜帶的數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求標(biāo)識(shí)從工作隊(duì)列中找到相應(yīng)的任務(wù),然后根據(jù)任務(wù)中攜帶的用戶訪問(wèn)請(qǐng)求標(biāo)識(shí),進(jìn)一步將訪問(wèn)結(jié)果反饋至最初發(fā)送訪問(wèn)請(qǐng)求的用戶側(cè),從而完成整個(gè)訪問(wèn)操作。
在數(shù)據(jù)庫(kù)訪問(wèn)響應(yīng)過(guò)程中,應(yīng)用服務(wù)器與用戶側(cè)的交互也可以使用NIO方式,具體而言,在S202~S203,應(yīng)用服務(wù)器根據(jù)所獲取的數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求任務(wù)中所攜帶的用戶訪問(wèn)請(qǐng)求標(biāo)識(shí),生成數(shù)據(jù)庫(kù)訪問(wèn)響應(yīng)任務(wù),將該任務(wù)放入工作隊(duì)列;后續(xù)將從工作隊(duì)列中獲取數(shù)據(jù)庫(kù)訪問(wèn)響應(yīng)任務(wù),然后針對(duì)所獲取的數(shù)據(jù)庫(kù)訪問(wèn)響應(yīng)任務(wù),使用NIO方式向用戶側(cè)發(fā)送用戶訪問(wèn)響應(yīng)。
圖4示出了一種包括完整數(shù)據(jù)訪問(wèn)請(qǐng)求和數(shù)據(jù)訪問(wèn)響應(yīng)過(guò)程的方法流程示意圖,為便于理解應(yīng)用服務(wù)器內(nèi)部的交互過(guò)程,將應(yīng)用服務(wù)器內(nèi)部劃分為5個(gè) 交互單元:用戶側(cè)NIO模塊、用戶交互任務(wù)隊(duì)列、工作線程池、數(shù)據(jù)庫(kù)驅(qū)動(dòng)層NIO模塊、數(shù)據(jù)庫(kù)交互任務(wù)隊(duì)列,基本功能如下:
用戶側(cè)NIO模塊和數(shù)據(jù)庫(kù)驅(qū)動(dòng)層NIO模塊:分別用于實(shí)現(xiàn)應(yīng)用服務(wù)器與用戶側(cè)設(shè)備、數(shù)據(jù)庫(kù)側(cè)設(shè)備之間的網(wǎng)絡(luò)通信,兩種模塊可以使用獨(dú)立于工作線程池的線程,并且均采用NIO方式與外部設(shè)備通信。
用戶交互任務(wù)隊(duì)列和數(shù)據(jù)庫(kù)交互任務(wù)隊(duì)列,相當(dāng)于與對(duì)前面實(shí)施例中的“工作隊(duì)列”從“用戶側(cè)”和“數(shù)據(jù)庫(kù)側(cè)”的角度進(jìn)行邏輯劃分,這里進(jìn)行劃分的目的僅是為了便于說(shuō)明,實(shí)際功能與前述的“工作隊(duì)列”相同。
工作線程池:與現(xiàn)有技術(shù)中的工作線程池作用相同,直接決定應(yīng)用服務(wù)器的業(yè)務(wù)支撐能力。
下面對(duì)圖4中的步驟進(jìn)行說(shuō)明:
數(shù)據(jù)請(qǐng)求階段:
S301,用戶側(cè)NIO模塊使用NIO方式接收用戶側(cè)發(fā)送的用戶訪問(wèn)請(qǐng)求。
S302,生成用戶訪問(wèn)請(qǐng)求任務(wù),并將該任務(wù)添加至用戶交互任務(wù)隊(duì)列,將任務(wù)標(biāo)記為待處理狀態(tài)。
S303~S304,工作線程池異步讀取所有待處理狀態(tài)的用戶訪問(wèn)請(qǐng)求任務(wù),對(duì)讀取到的任務(wù)進(jìn)行必要處理后,轉(zhuǎn)發(fā)給數(shù)據(jù)庫(kù)驅(qū)動(dòng)層NIO模塊;從用戶交互任務(wù)隊(duì)列讀取完畢的用戶訪問(wèn)請(qǐng)求任務(wù),狀態(tài)將相應(yīng)修改為已處理。
S305,數(shù)據(jù)庫(kù)驅(qū)動(dòng)層NIO模塊根據(jù)用戶訪問(wèn)請(qǐng)求任務(wù),確定目標(biāo)數(shù)據(jù)庫(kù)/表、構(gòu)建數(shù)據(jù)訪問(wèn)指令,然后與目標(biāo)數(shù)據(jù)庫(kù)設(shè)備建立長(zhǎng)連接,通過(guò)長(zhǎng)連接發(fā)送數(shù)據(jù)訪問(wèn)指令。
S306,確認(rèn)數(shù)據(jù)訪問(wèn)請(qǐng)求發(fā)送成功后,生成數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求任務(wù),并將該任務(wù)添加至數(shù)據(jù)庫(kù)交互任務(wù)隊(duì)列,將任務(wù)標(biāo)記為待處理狀態(tài);
在所生成的數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求任務(wù)中,需要攜帶以下信息:
本次數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求的標(biāo)識(shí),作用是在數(shù)據(jù)庫(kù)返回訪問(wèn)結(jié)果后,從任務(wù)隊(duì)列中找到對(duì)應(yīng)的任務(wù)。
S307,工作線程池釋放當(dāng)前任務(wù),這是由于任務(wù)添加至數(shù)據(jù)庫(kù)交互任務(wù)隊(duì) 列后,相當(dāng)于已經(jīng)對(duì)訪問(wèn)連接信息進(jìn)行保存,不需要使用線程一直進(jìn)行監(jiān)聽(tīng),因此當(dāng)前任務(wù)添加至數(shù)據(jù)庫(kù)交互任務(wù)隊(duì)列后,即可以釋放資源用于處理下一個(gè)任務(wù)。
數(shù)據(jù)響應(yīng)階段:
S308,數(shù)據(jù)庫(kù)側(cè)發(fā)送的數(shù)據(jù)庫(kù)訪問(wèn)響應(yīng)后,被數(shù)據(jù)庫(kù)側(cè)NIO模塊接收。
S309,對(duì)數(shù)據(jù)庫(kù)交互任務(wù)隊(duì)列進(jìn)行更新:
首先根據(jù)數(shù)據(jù)庫(kù)訪問(wèn)響應(yīng)中攜帶的數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求標(biāo)識(shí),從數(shù)據(jù)庫(kù)交互任務(wù)隊(duì)列中讀取具有相同標(biāo)識(shí)且狀態(tài)為待處理的數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求任務(wù)。從數(shù)據(jù)庫(kù)交互任務(wù)隊(duì)列讀取完畢的任務(wù),狀態(tài)將相應(yīng)修改為已處理。
進(jìn)一步,根據(jù)所獲取的數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求任務(wù)中所攜帶的用戶訪問(wèn)請(qǐng)求標(biāo)識(shí),生成數(shù)據(jù)庫(kù)訪問(wèn)響應(yīng)任務(wù),將該任務(wù)放入數(shù)據(jù)庫(kù)交互任務(wù)隊(duì)列,并且將任務(wù)標(biāo)記為待處理狀態(tài)。
S310~S311,工作線程池異步讀取所有待處理狀態(tài)的數(shù)據(jù)庫(kù)訪問(wèn)響應(yīng)任務(wù),對(duì)讀取到的任務(wù)進(jìn)行必要處理后,轉(zhuǎn)交給用戶側(cè)NIO模塊;從數(shù)據(jù)庫(kù)交互任務(wù)隊(duì)列讀取完畢的數(shù)據(jù)庫(kù)訪問(wèn)響應(yīng)任務(wù),狀態(tài)將相應(yīng)修改為已處理。
S312,用戶側(cè)NIO模塊針對(duì)所獲取的數(shù)據(jù)庫(kù)訪問(wèn)響應(yīng)任務(wù),使用NIO方式向用戶側(cè)發(fā)送用戶訪問(wèn)響應(yīng)。
從上述方案可以看出,應(yīng)用服務(wù)器向數(shù)據(jù)庫(kù)發(fā)送完訪問(wèn)請(qǐng)求后,處理線程就會(huì)被釋放,如果數(shù)據(jù)庫(kù)側(cè)耗時(shí)上升,只會(huì)增加工作隊(duì)列中的任務(wù)數(shù)量,對(duì)應(yīng)用服務(wù)器的線程占用沒(méi)有影響,因此不會(huì)導(dǎo)致應(yīng)用服務(wù)器的線程耗盡進(jìn)而影響業(yè)務(wù)訪問(wèn)量,也使得應(yīng)用服務(wù)器的CPU資源可以充分用來(lái)處理業(yè)務(wù)。進(jìn)一步地,由于工作線程數(shù)與業(yè)務(wù)訪問(wèn)量無(wú)關(guān),因此實(shí)際消耗的線程數(shù)量可以維持在一個(gè)比較小的數(shù)量上,從而降低線程切換開銷。
相應(yīng)于上述方法實(shí)施例,本申請(qǐng)還提供一種數(shù)據(jù)庫(kù)訪問(wèn)裝置,參見(jiàn)圖5所示,該裝置可以包括:
用戶訪問(wèn)請(qǐng)求接收模塊110,用于接收用戶側(cè)發(fā)送的用戶訪問(wèn)請(qǐng)求;
數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求發(fā)送模塊120,用于根據(jù)接收到的用戶訪問(wèn)請(qǐng)求,使用NIO 方式向數(shù)據(jù)庫(kù)側(cè)發(fā)送數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求;
數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求任務(wù)添加模塊130,用于在確認(rèn)數(shù)據(jù)訪問(wèn)請(qǐng)求發(fā)送成功后,生成數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求任務(wù),并將該任務(wù)添加至工作隊(duì)列,數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求任務(wù)中,攜帶有本次用戶訪問(wèn)請(qǐng)求標(biāo)識(shí)以及數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求標(biāo)識(shí);
線程釋放模塊140,用于釋放當(dāng)前的處理線程。
在本申請(qǐng)的一種具體實(shí)施方式中,用戶訪問(wèn)請(qǐng)求接收模塊110,可以具體用于:使用NIO方式接收用戶側(cè)發(fā)送的用戶訪問(wèn)請(qǐng)求,根據(jù)接收到的用戶訪問(wèn)請(qǐng)求,生成用戶訪問(wèn)請(qǐng)求任務(wù),并將該任務(wù)添加至工作隊(duì)列。
相應(yīng)的,數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求發(fā)送模塊120,可以具體用于:從工作隊(duì)列中獲取用戶訪問(wèn)請(qǐng)求任務(wù),針對(duì)所獲取的用戶訪問(wèn)請(qǐng)求任務(wù),使用NIO方式向數(shù)據(jù)庫(kù)側(cè)發(fā)送數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求。
參見(jiàn)圖6所示,在本申請(qǐng)的一種具體實(shí)施方式中,數(shù)據(jù)庫(kù)訪問(wèn)裝置還可以包括:
數(shù)據(jù)庫(kù)訪問(wèn)響應(yīng)接收模塊210,用于使用NIO方式接收數(shù)據(jù)庫(kù)側(cè)發(fā)送的數(shù)據(jù)庫(kù)訪問(wèn)響應(yīng);
數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求任務(wù)獲取模塊220,用于根據(jù)數(shù)據(jù)庫(kù)訪問(wèn)響應(yīng)中攜帶的數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求標(biāo)識(shí),從工作隊(duì)列中獲取具有相同標(biāo)識(shí)的數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求任務(wù);
用戶訪問(wèn)響應(yīng)發(fā)送模塊230,用于根據(jù)所獲取的數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求任務(wù)中所攜帶的用戶訪問(wèn)請(qǐng)求標(biāo)識(shí),向用戶側(cè)發(fā)送用戶訪問(wèn)響應(yīng)。
在本申請(qǐng)的一種具體實(shí)施方式中,用戶訪問(wèn)響應(yīng)發(fā)送模塊230可以具體用于:使用NIO方式向用戶側(cè)發(fā)送用戶訪問(wèn)響應(yīng)。
具體而言,數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求任務(wù)獲取模塊220,還可以根據(jù)所獲取的數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求任務(wù)中所攜帶的用戶訪問(wèn)請(qǐng)求標(biāo)識(shí),生成數(shù)據(jù)庫(kù)訪問(wèn)響應(yīng)任務(wù),并將該任務(wù)添加至工作隊(duì)列;相應(yīng)地,用戶訪問(wèn)響應(yīng)發(fā)送模塊230,從工作隊(duì)列中獲取數(shù)據(jù)庫(kù)訪問(wèn)響應(yīng)任務(wù),針對(duì)所獲取的數(shù)據(jù)庫(kù)訪問(wèn)響應(yīng)任務(wù),使用NIO方式向用戶側(cè)發(fā)送用戶訪問(wèn)響應(yīng)。
上述裝置中各個(gè)模塊的功能和作用的實(shí)現(xiàn)過(guò)程具體詳見(jiàn)上述方法中對(duì)應(yīng)步 驟的實(shí)現(xiàn)過(guò)程,在此不再贅述。
通過(guò)以上的實(shí)施方式的描述可知,本領(lǐng)域的技術(shù)人員可以清楚地了解到本申請(qǐng)可借助軟件加必需的通用硬件平臺(tái)的方式來(lái)實(shí)現(xiàn)?;谶@樣的理解,本申請(qǐng)的技術(shù)方案本質(zhì)上或者說(shuō)對(duì)現(xiàn)有技術(shù)做出貢獻(xiàn)的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來(lái),該計(jì)算機(jī)軟件產(chǎn)品可以存儲(chǔ)在存儲(chǔ)介質(zhì)中,如ROM/RAM、磁碟、光盤等,包括若干指令用以使得一臺(tái)計(jì)算機(jī)設(shè)備(可以是個(gè)人計(jì)算機(jī),服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本申請(qǐng)各個(gè)實(shí)施例或者實(shí)施例的某些部分所述的方法。
本說(shuō)明書中的各個(gè)實(shí)施例均采用遞進(jìn)的方式描述,各個(gè)實(shí)施例之間相同相似的部分互相參見(jiàn)即可,每個(gè)實(shí)施例重點(diǎn)說(shuō)明的都是與其他實(shí)施例的不同之處。尤其,對(duì)于裝置實(shí)施例而言,由于其基本相似于方法實(shí)施例,所以描述得比較簡(jiǎn)單,相關(guān)之處參見(jiàn)方法實(shí)施例的部分說(shuō)明即可。以上所描述的裝置實(shí)施例僅僅是示意性的,其中所述作為分離部件說(shuō)明的模塊可以是或者也可以不是物理上分開的,在實(shí)施本申請(qǐng)方案時(shí)可以把各模塊的功能在同一個(gè)或多個(gè)軟件和/或硬件中實(shí)現(xiàn)。也可以根據(jù)實(shí)際的需要選擇其中的部分或者全部模塊來(lái)實(shí)現(xiàn)本實(shí)施例方案的目的。本領(lǐng)域普通技術(shù)人員在不付出創(chuàng)造性勞動(dòng)的情況下,即可以理解并實(shí)施。
以上所述僅是本申請(qǐng)的具體實(shí)施方式,應(yīng)當(dāng)指出,對(duì)于本技術(shù)領(lǐng)域的普通技術(shù)人員來(lái)說(shuō),在不脫離本申請(qǐng)?jiān)淼那疤嵯?,還可以做出若干改進(jìn)和潤(rùn)飾,這些改進(jìn)和潤(rùn)飾也應(yīng)視為本申請(qǐng)的保護(hù)范圍。