新四季網

查詢數據的方法及裝置製造方法

2023-05-18 22:30:46 2

查詢數據的方法及裝置製造方法
【專利摘要】本申請公開了查詢數據的方法及裝置,其中,所述方法包括:攔截當前查詢請求;判斷是否存在與該當前查詢請求相同的歷史查詢請求正在執行查詢資料庫的操作;如果是,則阻塞所述當前查詢請求;待所述歷史查詢請求執行完成後,利用其查詢結果向所述當前查詢請求返回查詢結果。在實現過程中,本申請實施例不會出現在一次查詢資料庫操作正在執行的過程中,又有相同的查詢請求重複提交到資料庫的情況,有效減輕了資料庫的訪問負擔,並提高了查詢效率。
【專利說明】查詢數據的方法及裝置
【技術領域】
[0001]本申請涉及數據查詢【技術領域】,特別是涉及查詢數據的方法及裝置。
【背景技術】
[0002]在高並發環境下,很容易發生以下情況:在同一時間段內,大量用戶對資料庫系統的並發查詢導致資料庫壓力增大,響應緩慢,進而影響整個系統的正常運轉。但在實踐中發現,在大量的查詢請求中有很多都是同樣的。例如,用戶點擊網站首頁,如果首頁上面需要展示的部分或全部數據來自於資料庫,則大部分內容對於用戶來說是完全一樣的,對於後臺伺服器而言,需要執行的資料庫查詢操作也是一樣的。
[0003]基於該特點,為了提高數據查詢的效果,現有技術中一般會採用緩存來應對,也即,如果客戶端提交的兩個查詢是完全一樣的,則伺服器端會緩存前一個查詢結果,並直接將緩存的查詢結果返回給下一個相同的查詢,從而減少對資料庫的訪問。由於內存比資料庫的讀寫效率要高,所以對於發起同樣請求的客戶端來說,響應時間會大大縮短。
[0004]然而,現有技術中雖然使用了緩存方案,但是,在緩存尚未建立的時間段內,所有的查詢請求都會無差別地提交到資料庫裡。如果查詢時間較長,那麼這段時間內產生的並發請求也足以使資料庫性能驟降,因此,仍然會經常發生資料庫負擔過重的問題。

【發明內容】

[0005]本申請提供了查詢數據的方法及裝置,能夠避免對資料庫造成不必要的負擔,有利於提高查詢效率。
[0006]本申請提供了如下方案:
[0007]一種查詢數據的方法,包括:
[0008]攔截當前查詢請求;
[0009]判斷是否存在與該當前查詢請求相同的歷史查詢請求正在執行查詢資料庫的操作;
[0010]如果是,則阻塞所述當前查詢請求;
[0011]待所述歷史查詢請求執行完成後,利用其查詢結果向所述當前查詢請求返回查詢結果。
[0012]一種查詢數據的裝置,包括:
[0013]請求攔截單元,用於攔截當前查詢請求;
[0014]判斷單元,用於判斷是否存在與該當前查詢請求相同的歷史查詢請求正在執行查詢資料庫的操作;
[0015]請求阻塞單元,用於如果判斷單元的判斷結果為是,則阻塞所述當前查詢請求;
[0016]查詢結果返回單元,用於待所述歷史查詢請求執行完成後,利用其查詢結果向所述當前查詢請求返回查詢結果。
[0017]根據本申請提供的具體實施例,本申請公開了以下技術效果:[0018]通過本申請,在攔截到一個資料庫查詢請求之後,可以首先判斷是否存在相同的查詢請求正在執行查詢資料庫的操作,如果存在,則可以將該當前查詢請求阻塞,不再將其提交到資料庫進行查詢,等到正在執行查詢資料庫操作的查詢請求獲得查詢結果之後,再利用該查詢結果向當前查詢請求返回查詢結果。因此,在實現過程中,不會出現在一次查詢資料庫操作正在執行的過程中,又有相同的查詢請求重複提交到資料庫的情況,因此,減輕了資料庫的訪問負擔,有利於提高查詢效率。
[0019]當然,實施本申請的任一產品並不一定需要同時達到以上所述的所有優點。
【專利附圖】

【附圖說明】
[0020]為了更清楚地說明本申請實施例或現有技術中的技術方案,下面將對實施例中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本申請的一些實施例,對於本領域普通技術人員來講,在不付出創造性勞動的前提下,還可以根據這些附圖獲得其他的附圖。
[0021]圖1是本申請實施例提供的方法的流程圖;
[0022]圖2是本申請實施例提供的另一方法的流程圖;
[0023]圖3是本申請實施例提供的裝置的示意圖。
【具體實施方式】
[0024]下面將結合本申請實施例中的附圖,對本申請實施例中的技術方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本申請一部分實施例,而不是全部的實施例。基於本申請中的實施例,本領域普通技術人員所獲得的所有其他實施例,都屬於本申請保護的範圍。
[0025]本申請發明人在實現本申請的過程中發現,現有技術的緩存方案中,之所以仍然會產生資料庫負載過重,查詢效果不高的問題,一方面原因是,現有技術中往往存在以下情況:如果資料庫查詢請求A在執行時,發現緩存中沒有對應的查詢結果,則它會立即被資料庫執行,也即進行查詢資料庫的操作,得到查詢結果;但是,如果執行過程中有新的查詢Al被提交,不論Al請求的內容與A請求的內容是否相同,Al同樣也會立即得到執行,這樣就造成在A與Al請求相同時,兩個請求都會被執行,並且直到A查詢完成並緩存結果,後續的新請求才能利用緩存內容。也就是說,必須等到至少有一個查詢返回查詢結果並存入緩存中,才能使後續的查詢能夠利用緩存提升性能;而如果在第一個查詢結果返回前,又同時發生了其他同樣的查詢,由於無緩存可用,所有的查詢都會從頭開始執行,而實際上查詢的內容卻是一樣的,這顯然增加了資料庫系統的負擔。
[0026]為此,本申請實施例提供了一種查詢數據的方法,參見圖1,該方法可以包括以下步驟:
[0027]SlOl:攔截當前查詢請求;
[0028]在本申請實施例中,可以在伺服器端對查詢請求進行攔截操作,也即,當接收到一個資料庫查詢請求之後,不是直接將其提交到資料庫進行查詢,而是首先進行一些判斷處理操作,之後再確定是否需要提交到資料庫進行查詢。
[0029]S102:判斷是否存在與該當前查詢請求相同的歷史查詢請求正在執行查詢資料庫的操作;
[0030]具體在進行判斷操作時,可以首先判斷緩存中是否已經存在與該查詢請求相關的查詢結果,如果存在,則直接從緩存中取出查詢結果返回即可。如果緩存中還沒有查詢結果,本申請實施例不是直接將查詢請求提交到資料庫進行查詢操作,而是進一步判斷一下是否存在與該當前查詢請求相同的歷史查詢請求正在執行查詢資料庫的操作,如果存在,則不再將該請求提交到資料庫進行查詢,直接等待當前正在執行的查詢請求的查詢結果即可,這樣可以減少對資料庫的訪問,減輕資料庫的負擔。
[0031]具體地,為了在攔截到一個查詢請求時,判斷出是否存在與該當前查詢請求相同的歷史查詢請求正在執行查詢資料庫的操作,本申請實施例可以在緩存中保存正在執行的查詢請求的信息,例如校驗信息,該校驗信息可以是對應查詢語句的籤名信息(例如,MD5值等等),這樣在接收到新的查詢請求之後,就可以首先計算當前查詢請求的查詢語句的籤名信息,得到當前查詢請求的校驗信息,並判斷緩存中是否存在與當前查詢請求的校驗信息匹配的內容,如果存在,則確定存在與該當前查詢請求相同的歷史查詢請求正在執行。
[0032]也就是說,在攔截到一個查詢請求之後,可以首先根據該查詢請求的查詢語句做MD5籤名,算出信息摘要(diges t)字符串,然後判斷緩存中是否存在與該diges t字符串匹配的內容,如果不存在,則證明沒有相同的查詢請求正在執行,進而,就可以將該查詢請求對應的digest字符串保存在緩存中,例如,JAVA裡面具體可以利用並發哈希表(ConcurrentHashMap)來保存diges t與查詢語句的映射,這樣就可以將該查詢請求提交到資料庫執行查詢操作。在後續如果再有相同的查詢請求被攔截到時,就可以利用計算出新的查詢請求的digest字符串,然後通過與緩存中保存的內容進行比較,就可以判斷出存在相同的查詢請求正在執行資料庫查詢操作。
[0033]需要說明的是,對於各個相同的查詢請求而言,只需要在第一個查詢請求被提交到資料庫進行查詢操作時,向緩存中寫入查詢請求的校驗信息,後續的查詢請求再被攔截到時,如果緩存中存在與其校驗信息相同的內容,則不需要再重新寫入緩存,也不需要執行資料庫查詢操作。
[0034]另外需要說明的是,查詢請求的查詢語句一般是某種具有特定規則組合的文本,也有少數是二進位數據。因此,可以基於整個查詢語句做MD5籤名,算出digest字符串。根據MD5的原理,可以保證在查詢語句相同的情況下,得到的digest字符串是相同的,因此,如果發現兩個查詢請求對應的digest字符串相同,就可以證明兩個查詢請求具有相同的查詢語句,也就是說,這兩個查詢請求是相同的。
[0035]當然,在實際應用中,還可以有其他的判斷兩個查詢請求是否相同的實現方式,例如,直接在緩存中保存查詢語句,或者,對查詢語句進行其他的摘要處理,保存得到的摘要信息,等等,這裡不再一一詳述。
[0036]S103:如果是,則阻塞所述當前查詢請求;
[0037]如果發現存在與當前查詢查詢請求相同的查詢請求正在執行查詢資料庫的操作,則可以將當前查詢請求阻塞,不再將其提交到資料庫進行查詢,而是等待其他相同查詢請求的查詢結果。也就是說,對於相同的查詢請求而言,執行的資料庫查詢操作都是相同的,因此,只要其中一個執行具體的查詢資料庫的操作即可,不需要重複提交。其中,所謂的將當前查詢請求阻塞,相當於將對應的程序轉移到另一個對象上等待正在執行的查詢請求的查詢結果。當然,在一個查詢請求執行查詢的過程中,可能攔截到了多個與之相同的查詢請求,此時可將這些查詢請求全部阻塞,直到該查詢請求得到查詢結果之後,再通知各個相同的查詢請求對應的發起方到來提取相應的查詢結果。
[0038]當然,如果判斷出不存在與當前查詢請求相同的查詢請求正在執行查詢資料庫的操作,則可以將該當前查詢請求提交到資料庫執行具體的查詢操作。同時,還可以在緩存中保存該當前查詢請求的校驗信息,這樣,如果在該當前查詢請求執行資料庫查詢操作的過程中,又攔截到了新的查詢請求,就可以通過比對新的查詢請求的校驗信息與緩存中的信息,來判斷新的查詢請求是否與當前查詢請求相同,以此類推。
[0039]S104:待所述歷史查詢請求執行完成後,利用其查詢結果向所述當前查詢請求返回查詢結果。
[0040]當正在執行查詢資料庫操作的查詢請求獲得查詢結果之後,就可以首先將查詢結果保存在緩存中,在保存時,可以以該查詢請求的校驗信息作為鍵值。並通知其他各個相同查詢請求的發起方到緩存中來提取查詢結果。因此,對於被阻塞的查詢請求而言,在收到通知消息之後,就意味著之前正在執行查詢資料庫操作的查詢請求已經完成查詢,因此,就可以到緩存中找到相應的鍵值對應的查詢結果即可。
[0041 ] 可見,在本申請實施例中,在攔截到一個資料庫查詢請求之後,可以首先判斷是否存在相同的查詢請求正在執行查詢資料庫的操作,如果存在,則可以將該當前查詢請求阻塞,不再將其提交到資料庫進行查詢,等到正在執行查詢資料庫操作的查詢請求獲得查詢結果之後,再利用該查詢結果向當前查詢請求返回查詢結果。因此,在實現過程中,不會出現在一次查詢資料庫操作正在執行的過程中,又有相同的查詢請求重複提交到資料庫的情況,因此,減輕了資料庫的訪問負擔,有利於提高查詢效率。
[0042]如前文所述,為了能夠判斷出兩個查詢請求是否相同,可以在第一個查詢請求提交到資料庫進行查詢時,在緩存中保存對應的校驗信息,然後第二個查詢請求被攔截到之後,就可以通過比對校驗信息,判斷兩者是否相同。但是,在實際應用中,將校驗信息寫入緩存也需要一定的時間,並且現在的硬體環境中往往存在多個內核共存的情況,使得多個指令可以並行處理,兩個查詢請求可能會在兩個內核中並行處理,因此,在按照本申請的上述方法實現數據查詢的過程中,可能存在以下情況:兩個查詢請求到達的時間間隔可能只是毫秒級,甚至更短,這樣,當一個查詢請求A將其校驗信息寫入到緩存的過程中(尚未完全寫入),另一個查詢請求B可能就已經被攔截到;此時,查詢請求B在訪問緩存時,就會發現,緩存中不存在與該查詢請求B相同的查詢請求,因此,就可能也會再針對該查詢請求B執行將校驗信息寫入緩存的操作,並將該查詢請求B也提交到資料庫進行查詢,這樣,就仍然可能出現一個查詢請求正在資料庫中查詢的過程中,又有一個相同的查詢請求被提交到資料庫進行查詢的現象。
[0043]為了避免上述情況的發生,進一步降低資料庫的負擔,提高數據查詢的效率,在單機情況下,可以通過一定的機制來保證各個查詢請求在寫緩存事務上的原子性。所謂的原子性,就是指一個事務要麼完全被執行,要麼完全不被執行,不會出現在一個事務尚未被完全執行的過程中,被插入另一個事務的現象。具體實現時,JAVA程序中可以利用某個JAVA對象加鎖,只有取得該鎖之後,才能執行後續步驟。語言層面的鎖可以由作業系統來保證,足以確保兩個查詢請求A和B不會同時獲取到鎖,從而就給查詢請求A、B安排了先後順序,防止了同時提交。當查詢請求A完成某操作之後,再解鎖。查詢請求B完成某操作之後,也解鎖,如果有更多的查詢請求,都做類似處理。當然,如果資料庫被部署在分布式環境下,可以使用zookeeper之類的分布式鎖來解決。
[0044]具體實現時,每攔截到一個查詢請求,都可以首先嘗試去鎖定一個指定的計數器對象,只有在鎖定成功的情況下,才能訪問緩存,在訪問緩存時,如果發現緩存中存在與自己的校驗信息相匹配的內容,則可以阻塞自身以等待歷史查詢請求完成的通知;如果發現緩存中不存在與自己的校驗信息相匹配的內容,則可以執行將自己的校驗信息寫入緩存的操作,在全部寫入完成之後,再解除對計數器對象的鎖定。只有在一個查詢請求解除鎖定之後,其他的查詢請求才能鎖定成功,只有在鎖定成功之後才能訪問緩存。這樣,對於後續的查詢請求而言,就算在前一個查詢請求尚未完成將校驗信息寫入到緩存的操作時,就已經被攔截到,也會因為無法成功鎖定而無法訪問緩存,進而也不會將其提交到資料庫進行查詢。因此,也就保證了即使在非常短的時間內接收到了多個相同的查詢請求,也只有一個查詢請求會被提交到資料庫執行查詢操作,其他的查詢請求都只需等待其查詢結果即可。
[0045]例如,首先攔截到了查詢請求A,如果在此之前尚未接收到與之相同的查詢請求,則一定被會成功鎖定,計算出的MD5籤名是digest,此時,查詢緩存也會發現,緩存中並不存在與該digest相匹配的內容,因此,就可以在緩存中保存以下內容:〈digest, SQL_A>,並將該查詢請求A提交到資料庫進行查詢操作。如果在攔截到查詢請求A之後的很短時間內,又攔截到了查詢請求B,並且查詢請求B =查詢請求A,但是,查詢請求B被攔截到後,在嘗試鎖定執行的計數器對象時,會發現無法鎖定成功,因為已經被查詢請求A鎖定,直到將查詢請求A的digest等內容完全寫入到緩存中之後,才會解除鎖定,此時,查詢請求B才會鎖定成功。查詢請求B鎖定成功之後,就可以計算出查詢請求B的MD5籤名,並可以查詢緩存,由於查詢請求B =查詢請求A,所以查詢請求B的MD5籤名也是diges t,所以查詢請求B會看到緩存裡面有〈digest,SQL_A>這條記錄存在,因此,就不會再將查詢請求B提交到資料庫。雖然此時查詢請求A對應的資料庫查詢操作尚未執行完畢,緩存中尚未有對應的查詢結果,查詢請求B知道已經有同樣的查詢正在執行,因此,它自己可以放棄執行,直接等待查詢請求A的查詢結果。
[0046]在實際應用中,一段時間內發生的不同的資料庫查詢數量可能成千上萬,全部都將查詢結果長時間緩存起來成本很高,因此,在應用了本申請提供的上述方案之後,在對查詢結果進行緩存時,可以採用如下優選方式:如果查詢請求A被提交到資料庫之後,在執行查詢的過程中又收到了與該查詢請求A相同的查詢請求B、C、D,則在將查詢結果返回給查詢請求A、B、C、D之後,就可以將〈digest,SQL_A>這條記錄從緩存中刪除,並將對應的查詢結果也刪除。這樣,如果後續又接收到新的查詢請求E,並且也與查詢請求A相同,則由於緩存中已經不再保存有查詢請求A的查詢結果,因此,仍然將查詢請求E提交到資料庫進行查詢。如果在查詢的過程中又接收到相同的查詢請求F、G,就可以將查詢請求E的查詢結果返回給查詢請求F、G的發起方。
[0047]當然,在實際應用中,在前述情況下,關於查詢請求A的查詢結果,也可以選擇保留一段時間供後續同樣的查詢調用。但資料庫中的數據更新速度一般比較快,為了保證查詢到的數據儘可能地跟隨資料庫的更新,都可以採用前述方式,也即查詢請求A在獲得查詢結果之後,只要在該查詢請求A在查詢資料庫過程中接收到的新的相同查詢請求都獲得查詢結果之後,就可以將查詢結果從緩存中刪除,後續再有相同的查詢請求時,也重新到資料庫中查詢,不再使用之前的查詢結果。這樣可以最大限度的減少誤差,提升數據準確性。如果確實需要緩存一段時間,可以使用常規的緩存方案來對查詢結果單獨緩存。
[0048]按照本申請實施例中方案,如果在查詢請求A執行資料庫查詢的過程中,又接收到了查詢請求B、C、D,則需要在將查詢結果返回給查詢請求A、B、C、D之後,才會將此次的查詢結果刪除。為了保證在刪除查詢結果之前,查詢請求A、B、C、D都已經獲得了查詢結果,本申請實施例可以在一個查詢請求被提交到資料庫執行查詢操作時,為該查詢請求關聯一個計數器,在該查詢請求執行資料庫查詢的過程中,每次截獲到與之相同的查詢請求,均將該計數器的值增加一個計數單位,直到獲取到查詢結果;在獲取到查詢結果後,每向一個查詢請求的發起方返回查詢結果,均將該計數器的值減小一個基計數單位,當計數器的值被減小到預置的值(例如為O)時,確定具有相同校驗信息的各個查詢請求均已獲得查詢結果,此時,就可以將該查詢結果刪除了。
[0049]例如,假設A、B、C三個相同的查詢請求到達應用系統,基於上述機制,查詢請求A被提交資料庫執行實際查詢,查詢請求B、C等待查詢請求A的查詢結果。可以為這些查詢請求維護一個單獨的計數器count,查詢請求A獲取同步鎖後,count加I,查詢請求B、C獲取同步鎖後count也各自加I。這樣最終count = 3。
[0050]當查詢請求A查詢資料庫完畢後,先將查詢結果a保存在內存變量中,再依次開始向查詢請求A、B、C的發起方返回這個查詢結果a。當查詢請求A的發起方收到查詢結果a後,count減I,查詢請求B的發起方收到查詢結果a後再減I,查詢請求C也一樣。當count=O時,查詢結果a就結束使命,可以刪除了。在整個操作的過程中,count保持原子性,避免出錯。
[0051]最後需要說明的是,本申請實施例相當於在普通的用戶函數基礎上包裝了一層,加上了對查詢請求的攔截、判重、緩存、計數、查詢結果緩存、通知返回等機制,最終達到提高查詢效率、降低資料庫負擔的目的。
[0052]為了更好地理解本申請實施例提供的上述方案,下面通過一個實際應用中的例子進行更為詳細的介紹。參見圖2,該方法可以包括以下步驟:
[0053]S201:攔截到查詢請求A ;
[0054]S202:獲取查詢請求A的查詢語句;
[0055]S203:嘗試鎖定指定的對象;如果鎖定不成功,則每隔預置的時間間隔返回到該步驟新進行嘗試,或者,也可以利用程序語言本身的特性先阻塞,然後等待作業系統調度;
[0056]S204:如果鎖定成功,則計算查詢請求A的查詢語句的唯一性標識a,例如MD5籤名信息等;
[0057]S205:讀取緩存,判斷標識a是否存在在緩存中;如果是,則進入步驟S206,否則進入步驟S211 ;
[0058]S206:取出與標識a關聯的計數器countA,並將countA的值原子性地加I ;
[0059]S207:等待與countA相關的通知消息;
[0060]S208:接收到通知消息之後,從緩存中取出標識a對應的查詢結果,並將countA的值原子性地減I ;
[0061]S209:判斷countA的值是否為0,如果是,則進入步驟S210,否則進入步驟S217 ;[0062]S210:刪除與標識a相關的查詢結果;
[0063]S211:原子性地將標識a保存在緩存中,並關聯一個值為O的計數器countA ;
[0064]S212:判斷是否保存成功,如果是,進入步驟S213,否則進入步驟S206 ;
[0065]S213:將查詢請求A提交到資料庫進行查詢;
[0066]S214:以標識a為鍵值將查詢結果保存在緩存中;
[0067]S215:通知所有標識為a的查詢請求發起方到緩存中提取查詢結果;
[0068]S216:原子性地刪除緩存中的標識a,但不回收計數器countA ;
[0069]S217:向查詢請求的發起方返回查詢結果。
[0070]與本申請實施例提供的數據查詢方法相對應,本申請實施例還提供了一種數據查詢裝置參見圖3,該裝置可以包括:
[0071]請求攔截單元301,用於攔截當前查詢請求;
[0072]判斷單元302,用於判斷是否存在與該當前查詢請求相同的歷史查詢請求正在執行查詢資料庫的操作;
[0073]請求阻塞單元303,用於如果判斷單元的判斷結果為是,則阻塞所述當前查詢請求;
[0074]查詢結果返回單元304,用於待所述歷史查詢請求執行完成後,利用其查詢結果向所述當前查詢請求返回查詢結果。
[0075]具體實現時,該裝置還可以包括:
[0076]請求提交單元,用於如果不存在與該當前查詢請求相同的歷史查詢請求正在執行查詢資料庫的操作,則將當前查詢請求提交到資料庫執行查詢操作。
[0077]為了判斷兩個查詢請求是否相同,該裝置還可以包括:
[0078]校驗信息緩存單元,用於在緩存中保存正在執行的查詢請求的校驗信息,所述校驗信息為對應查詢語句的籤名信息;
[0079]相應的,所述判斷單元302可以包括:
[0080]校驗信息獲取子單元,用於計算當前查詢請求的查詢語句的籤名信息,得到當前查詢請求的校驗信息;
[0081]匹配子單元,用於判斷緩存中是否存在與當前查詢請求的校驗信息匹配的內容,如果存在,則確定存在與該當前查詢請求相同的歷史查詢請求正在執行查詢資料庫的操作。
[0082]具體實現時,該裝置還可以包括:
[0083]查詢結果緩存單元,用於當正在執行查詢資料庫操作的查詢請求獲取到查詢結果之後,以所述校驗信息作為鍵值,在緩存中保存查詢結果;
[0084]通知單元,用於通知具有相同校驗信息的查詢請求發起方到緩存中提取相應的查詢結果。
[0085]為了在多個相同的查詢請求在非常短的時間內先後到達時,避免將多個查詢請求都提交到資料庫,該裝置還可以包括:
[0086]原子性保持單元,用於在查詢緩存過程中,保持各個查詢請求之間的原子性。
[0087]具體實現時,所述原子性保持單元可以包括:
[0088]鎖定嘗試子單元,用於攔截到所述當前查詢請求後,嘗試鎖定指定的計數器對象;
[0089]緩存查詢子單元,用於如果鎖定成功,則查詢緩存中是否存在與攔截到的查詢請求的校驗信息匹配的內容;
[0090]阻塞子單元,用於如果存在,則確定存在與該當前查詢請求相同的歷史查詢請求正在執行,並阻塞自身以等待歷史查詢請求完成的通知;
[0091]鎖定解除子單元,用於如果不存在,則將該當前查詢請求的校驗信息寫入到緩存中,完成寫入緩存的操作之後,解除對所述指定計數器對象的鎖定,並將該當前查詢請求提交到資料庫執行查詢操作。
[0092]為了最大限度的減少誤差,提升數據準確性,該裝置還可以包括:
[0093]刪除單元,用於當具有相同校驗信息的查詢請求都獲得查詢結果之後,從緩存中刪除該查詢結果;所述具有相同校驗信息的查詢請求為將一個查詢請求提交到資料庫進行查詢的過程中,接收到的與該查詢請求相同的查詢請求。
[0094]為了有效的判斷出各個查詢請求是否均以獲得查詢結果,該裝置還可以包括:
[0095]計數器關聯單元,用於當一個查詢請求被提交到資料庫執行查詢操作時,為該查詢請求關聯一個計數器對象;
[0096]計數器自加單元,用於在該查詢請求執行資料庫查詢的過程中,每次截獲到與之相同的查詢請求,均將該計數器的值增加一個計數單位,直到獲取到查詢結果;
[0097]計數器自減單元,用於在獲取到查詢結果後,每向一個查詢請求的發起方返回查詢結果,均將該計數器的值減小一個計數單位;
[0098]確定單元,用於當所述計數器的值被減小到預置的值時,確定具有相同校驗信息的各個查詢請求均已獲得查詢結果。
[0099]總之,在本申請實施例提供的上述裝置中,在攔截到一個資料庫查詢請求之後,可以首先判斷是否存在相同的查詢請求正在執行查詢資料庫的操作,如果存在,則可以將該當前查詢請求阻塞,不再將其提交到資料庫進行查詢,等到正在執行查詢資料庫操作的查詢請求獲得查詢結果之後,再利用該查詢結果向當前查詢請求返回查詢結果。因此,在實現過程中,不會出現在一次查詢資料庫操作正在執行的過程中,又有相同的查詢請求重複提交到資料庫的情況,因此,避免對資料庫造成不必要的負擔,有利於提高查詢效率。
[0100]通過以上的實施方式的描述可知,本領域的技術人員可以清楚地了解到本申請可藉助軟體加必需的通用硬體平臺的方式來實現。基於這樣的理解,本申請的技術方案本質上或者說對現有技術做出貢獻的部分可以以軟體產品的形式體現出來,該計算機軟體產品可以存儲在存儲介質中,如R0M/RAM、磁碟、光碟等,包括若干指令用以使得一臺計算機設備(可以是個人計算機,伺服器,或者網絡設備等)執行本申請各個實施例或者實施例的某些部分所述的方法。
[0101]本說明書中的各個實施例均採用遞進的方式描述,各個實施例之間相同相似的部分互相參見即可,每個實施例重點說明的都是與其他實施例的不同之處。尤其,對於系統或系統實施例而言,由於其基本相似於方法實施例,所以描述得比較簡單,相關之處參見方法實施例的部分說明即可。以上所描述的系統及系統實施例僅僅是示意性的,其中所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位於一個地方,或者也可以分布到多個網絡單元上。可以根據實際的需要選擇其中的部分或者全部模塊來實現本實施例方案的目的。本領域普通技術人員在不付出創造性勞動的情況下,即可以理解並實施。
[0102]以上對本申請所提供的查詢數據的方法及裝置,進行了詳細介紹,本文中應用了具體個例對本申請的原理及實施方式進行了闡述,以上實施例的說明只是用於幫助理解本申請的方法及其核心思想;同時,對於本領域的一般技術人員,依據本申請的思想,在【具體實施方式】及應用範圍上均會有改變之處。綜上所述,本說明書內容不應理解為對本申請的限制。
【權利要求】
1.一種查詢數據的方法,其特徵在於,包括: 攔截當前查詢請求; 判斷是否存在與該當前查詢請求相同的歷史查詢請求正在執行查詢資料庫的操作; 如果是,則阻塞所述當前查詢請求; 待所述歷史查詢請求執行完成後,利用其查詢結果向所述當前查詢請求返回查詢結果O
2.根據權利要求1所述的方法,其特徵在於,還包括: 如果不存在與該當前查詢請求相同的歷史查詢請求正在執行查詢資料庫的操作,則將當前查詢請求提交到資料庫執行查詢操作。
3.根據權利要求1所述的方法,其特徵在於,還包括: 在緩存中保存正在執行的查詢請求的校驗信息,所述校驗信息為對應查詢語句的籤名信息; 所述判斷是否存在與該當前查詢請求相同的歷史查詢請求正在執行查詢資料庫的操作包括: 計算當前查詢請求的查詢語句的籤名信息,得到當前查詢請求的校驗信息; 判斷緩存中是否存在與當前查詢請求的校驗信息匹配的內容,如果存在,則確定存在與該當前查詢請求相同的歷史查詢請求正在執行查詢資料庫的操作。
4.根據權利要求3所述的方法,其特徵在於,還包括: 當正在執行查詢資料庫操作的查詢請求獲取到查詢結果之後,以所述校驗信息作為鍵值,在緩存中保存查詢結果; 通知具有相同校驗信息的查詢請求發起方到緩存中提取相應的查詢結果。
5.根據權利要求3或4所述的方法,其特徵在於,還包括: 在查詢緩存過程中,保持各個查詢請求之間的原子性。
6.根據權利要求5所述的方法,其特徵在於,所述在查詢緩存過程中,保持各個查詢請求之間的原子性包括: 攔截到所述當前查詢請求後,嘗試鎖定指定的計數器對象; 如果鎖定成功,則查詢緩存中是否存在與攔截到的查詢請求的校驗信息匹配的內容;如果存在,則確定存在與該當前查詢請求相同的歷史查詢請求正在執行,並阻塞自身以等待歷史查詢請求完成的通知; 如果不存在,則將該當前查詢請求的校驗信息寫入到緩存中,完成寫入緩存的操作之後,解除對所述計數器對象的鎖定,並將該當前查詢請求提交到資料庫執行查詢操作。
7.根據權利要求1所述的方法,其特徵在於,還包括: 當具有相同校驗信息的查詢請求都獲得查詢結果之後,從緩存中刪除該查詢結果;所述具有相同校驗信息的查詢請求為將一個查詢請求提交到資料庫進行查詢的過程中,接收到的與該查詢請求相同的查詢請求。
8.根據權利要求7所述的方法,其特徵在於,還包括: 當一個查詢請求被提交到資料庫執行查詢操作時,為該查詢請求關聯一個計數器對象; 在該查詢請求執行資料庫查詢的過程中,每次截獲到與之相同的查詢請求,均將該計數器的值增加一個計數單位,直到獲取到查詢結果; 在獲取到查詢結果後,每向一個查詢請求的發起方返回查詢結果,均將該計數器的值減小一個計數單位; 當所述計數器的值被減小到預置的值時,確定具有相同校驗信息的各個查詢請求均已獲得查詢結果。
9.一種查詢數據的裝置,其特徵在於,包括: 請求攔截單元,用於攔截當前查詢請求; 判斷單元,用於判斷是否存在與該當前查詢請求相同的歷史查詢請求正在執行查詢資料庫的操作; 請求阻塞單元,用於如果判斷單元的判斷結果為是,則阻塞所述當前查詢請求; 查詢結果返回單元,用於待所述歷史查詢請求執行完成後,利用其查詢結果向所述當前查詢請求返回查詢結果。
10.根據權利要求9所述的裝置,其特徵在於,還包括: 請求提交單元,用於如果不存在與該當前查詢請求相同的歷史查詢請求正在執行查詢資料庫的操作,則將當前查詢請求提交到資料庫執行查詢操作。
【文檔編號】G06F17/30GK104035923SQ201310067958
【公開日】2014年9月10日 申請日期:2013年3月4日 優先權日:2013年3月4日
【發明者】周劍, 周宇 申請人:阿里巴巴集團控股有限公司

同类文章

一種新型多功能組合攝影箱的製作方法

一種新型多功能組合攝影箱的製作方法【專利摘要】本實用新型公開了一種新型多功能組合攝影箱,包括敞開式箱體和前攝影蓋,在箱體頂部設有移動式光源盒,在箱體底部設有LED脫影板,LED脫影板放置在底板上;移動式光源盒包括上蓋,上蓋內設有光源,上蓋部設有磨沙透光片,磨沙透光片將光源封閉在上蓋內;所述LED脫影

壓縮模式圖樣重疊檢測方法與裝置與流程

本發明涉及通信領域,特別涉及一種壓縮模式圖樣重疊檢測方法與裝置。背景技術:在寬帶碼分多址(WCDMA,WidebandCodeDivisionMultipleAccess)系統頻分復用(FDD,FrequencyDivisionDuplex)模式下,為了進行異頻硬切換、FDD到時分復用(TDD,Ti

個性化檯曆的製作方法

專利名稱::個性化檯曆的製作方法技術領域::本實用新型涉及一種檯曆,尤其涉及一種既顯示月曆、又能插入照片的個性化檯曆,屬於生活文化藝術用品領域。背景技術::公知的立式檯曆每頁皆由月曆和畫面兩部分構成,這兩部分都是事先印刷好,固定而不能更換的。畫面或為風景,或為模特、明星。功能單一局限性較大。特別是畫

一種實現縮放的視頻解碼方法

專利名稱:一種實現縮放的視頻解碼方法技術領域:本發明涉及視頻信號處理領域,特別是一種實現縮放的視頻解碼方法。背景技術: Mpeg標準是由運動圖像專家組(Moving Picture Expert Group,MPEG)開發的用於視頻和音頻壓縮的一系列演進的標準。按照Mpeg標準,視頻圖像壓縮編碼後包

基於加熱模壓的纖維增強PBT複合材料成型工藝的製作方法

本發明涉及一種基於加熱模壓的纖維增強pbt複合材料成型工藝。背景技術:熱塑性複合材料與傳統熱固性複合材料相比其具有較好的韌性和抗衝擊性能,此外其還具有可回收利用等優點。熱塑性塑料在液態時流動能力差,使得其與纖維結合浸潤困難。環狀對苯二甲酸丁二醇酯(cbt)是一種環狀預聚物,該材料力學性能差不適合做纖

一種pe滾塑儲槽的製作方法

專利名稱:一種pe滾塑儲槽的製作方法技術領域:一種PE滾塑儲槽一、 技術領域 本實用新型涉及一種PE滾塑儲槽,主要用於化工、染料、醫藥、農藥、冶金、稀土、機械、電子、電力、環保、紡織、釀造、釀造、食品、給水、排水等行業儲存液體使用。二、 背景技術 目前,化工液體耐腐蝕貯運設備,普遍使用傳統的玻璃鋼容

釘的製作方法

專利名稱:釘的製作方法技術領域:本實用新型涉及一種釘,尤其涉及一種可提供方便拔除的鐵(鋼)釘。背景技術:考慮到廢木材回收後再加工利用作業的方便性與安全性,根據環保規定,廢木材的回收是必須將釘於廢木材上的鐵(鋼)釘拔除。如圖1、圖2所示,目前用以釘入木材的鐵(鋼)釘10主要是在一釘體11的一端形成一尖

直流氧噴裝置的製作方法

專利名稱:直流氧噴裝置的製作方法技術領域:本實用新型涉及ー種醫療器械,具體地說是ー種直流氧噴裝置。背景技術:臨床上的放療過程極易造成患者的局部皮膚損傷和炎症,被稱為「放射性皮炎」。目前對於放射性皮炎的主要治療措施是塗抹藥膏,而放射性皮炎患者多伴有局部疼痛,對於止痛,多是通過ロ服或靜脈注射進行止痛治療

新型熱網閥門操作手輪的製作方法

專利名稱:新型熱網閥門操作手輪的製作方法技術領域:新型熱網閥門操作手輪技術領域:本實用新型涉及一種新型熱網閥門操作手輪,屬於機械領域。背景技術::閥門作為流體控制裝置應用廣泛,手輪傳動的閥門使用比例佔90%以上。國家標準中提及手輪所起作用為傳動功能,不作為閥門的運輸、起吊裝置,不承受軸向力。現有閥門

用來自動讀取管狀容器所載識別碼的裝置的製作方法

專利名稱:用來自動讀取管狀容器所載識別碼的裝置的製作方法背景技術:1-本發明所屬領域本發明涉及一種用來自動讀取管狀容器所載識別碼的裝置,其中的管狀容器被放在循環於配送鏈上的文檔匣或託架裝置中。本發明特別適用於,然而並非僅僅專用於,對引入自動分析系統的血液樣本試管之類的自動識別。本發明還涉及專為實現讀