• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      Django框架Web數據查詢分頁技術研究

      2014-01-16 09:21:40齊金剛李晉軍
      電子設計工程 2014年5期
      關鍵詞:數據量調用框架

      齊金剛,李 滔,李晉軍

      (西北工業(yè)大學 電子信息學院,陜西 西安 710129)

      隨著互聯(lián)網的迅速發(fā)展,Web數據庫的應用越來越多,用戶對訪問Web數據庫頁面的速度也要求越來越高,如何快速高效的對Web數據進行查詢分頁就成為了每個Web應用程序都要面對的一個問題。Django是一個由Python寫成的開放源代碼Web應用框架,它鼓勵快速開發(fā),并遵循MVT設計的設計模式,在Web應用開發(fā)方面具有得天獨厚的優(yōu)勢,本文就是研究在Django框架下實現(xiàn)Web數據查詢分頁的方法,并對實現(xiàn)方法進行測試和分析。

      1 Web數據查詢分頁技術研究

      把用戶請求的數據一次性全部交付給用戶是非常不明智的,因為這不但讓用戶苦苦等待時間較長,而且浪費寶貴的網絡資源[1]。而小塊數據便于在瀏覽器上顯示,不需要用戶滾屏瀏覽,避免漏掉一些重要的信息;在網絡上傳輸小塊數據,可以減少網絡流量,提高網頁的響應速度;另外,傳輸小塊數據也可以有效減少服務器負載[2]。所以我們要分批把數據傳輸給用戶,也就是分頁技術。

      圖1 Web數據查詢執(zhí)行過程示意圖Fig. 1 diagram of the implementation process of Web data query

      如圖1所示,在進行Web數據查詢時,其執(zhí)行過程可簡化為一個三層的網絡結構,三層分別在不同的網絡環(huán)境中,所以實現(xiàn)Web數據查詢分頁可以在3個不同層次中進行。

      1.1 在客戶層分頁

      就是Web服務器和數據庫服務器將滿足用戶查詢條件的數據一次性全部發(fā)送給用戶,瀏覽器在顯示給用戶的時候進行分頁。這種分頁只能帶來瀏覽的便利,對查詢性能的改善沒有幫助,本文中不再討論。

      1.2 在Web服務層分頁

      數據庫服務器將滿足查詢條件的數據全部發(fā)送給Web服務器,由Web服務器對數據進行分頁處理,然后返回給用戶需要顯示的某一頁數據。該方案可以改善Web服務層到客戶層之間的網絡環(huán)境,但是數據庫服務層到Web服務層之間的網絡流量并沒有減少。在ASP.NET、J2EE等進行動態(tài)Web應用開發(fā)常用的技術中,實現(xiàn)在Web服務層分頁的手段較多,比較常用的主要有以下幾種[3-4]:

      1)將查詢結果緩存在HttpSession或有狀態(tài)bean中實現(xiàn)分頁。這種方法使用比較多,其優(yōu)點是減少了對數據庫的訪問次數,對數據庫連接以及游標等訪問資源占用也較少。但其有兩個主要的缺點:一是用戶可能看到的是過期數據;二是如果數據量非常大時第一次查詢遍歷結果集會耗費很長時間,并且緩存的數據也會占用大量內存,效率明顯下降。

      2)用ResultSet移動游標實現(xiàn)分頁。每次翻頁都查詢一次數據庫,在需要分頁的地方,直接操作ResultSet對象,移動游標到相應位置。這種方法比較簡單方便,但由于游標是放在內存中,它將占用內存。特別在操作大型數據庫模型進行分頁時,每次都加載整個數據源并緩存ResultSet,非常浪費資源。

      3)利用ADO Recordset技術實現(xiàn)分頁。ADO(Active Data Object)技術是 Microsoft公司支持的一種主要的數據存取技術,ADO提供了一種數據分頁技術,是通過 Recordset對象來實現(xiàn)的。利用ADO的Recordset對象可以簡單方便地實現(xiàn)數據分頁,可是必須將所有數據全部封裝進Recordset對象后才能進行分頁,如果數據量很大,比如超過上萬條,那么封裝數據就是一個相當耗時、耗資源的過程,因此該技術只能適合小數據量的分頁顯示。

      4)利用平臺自帶的分頁控件(如DataGrid控件)。當數據量較小時,利用平臺自身的控件分頁實現(xiàn)起來比較容易,但當數據庫中的數據量很大時,一般的內建分頁方法就過于粗糙,它的方便性是以犧牲系統(tǒng)性能為代價的。

      1.3 在數據庫服務層分頁

      數據庫每次只返回需要顯示的數據記錄,按照用戶的需要提交給Web服務器和用戶一頁數據。存儲過程分頁從數據源頭就開始進行分頁,減少了三層之間的數據流量從而提高了整個網絡的查詢性能[5]。目前,實現(xiàn)在數據庫服務層分頁的方法主要有以下兩種:

      1)調用儲存過程。在數據層編寫一個存儲過程,在其中根據 Web應用程序提供的一些參數(如頁面大小、當前頁)來執(zhí)行查詢操作得到符合條件的一頁記錄,然后將查詢結果通過Web服務器最終交付給用戶。存儲過程實際只有在第一次使用時被數據庫引擎編譯,編譯后的映象和過程就存儲在服務器上,不必每次執(zhí)行時都編譯,因此能充分發(fā)揮服務器的優(yōu)越性能,大大提高執(zhí)行速度。但是有些數據庫(如SQLite)是不支持存儲過程的,使用的時候需要注意。

      2)利用數據庫自身提供的分頁方法。很多數據庫自身就提供了各種函數或變量來控制數據庫的分頁,如MySQL的limit子句,Web應用程序將這樣的SQL語句傳遞給數據庫服務器可以實現(xiàn)查詢分頁。這種方法的優(yōu)點是執(zhí)行效率比較高,缺點是由于不同的數據庫提供的關于分頁的函數或方法各有不同,很難統(tǒng)一。

      以上兩種方法相比較,利用數據庫自身提供的分頁方法需要傳遞整個SQL語句,而調用存儲過程只需要傳遞存儲過程名和相應的參數,很大程度上降低了通信負載,進而提高了應用程序的效率,這種情況在數據量大的時候,體現(xiàn)尤為明顯。而且兩者的調用方法基本一樣,所以在本文中只對調用存儲過程這種方法進行深入研究。

      2 在Web服務層分頁

      在Web服務層進行分頁是一種比較常用的方法,其執(zhí)行過程如圖2所示。在Django框架中,我們可以分別利用緩存機制和Session框架實現(xiàn)這一功能。

      圖2 Web層分頁執(zhí)行過程示意圖Fig. 2 diagram of the implementation process of pagination in Web layer

      2.1 利用Django緩存機制

      利用Django框架的緩存機制實現(xiàn)Web服務層分頁,就是當數據庫服務器把所有符合條件的數據發(fā)送回Web服務器之后,將這些數據放入緩存中,當用戶請求不同頁數的數據時直接從緩存中讀取,發(fā)送到用戶瀏覽器。Django框架有著完善的緩存機制,支持內存緩存、數據庫緩存、文件系統(tǒng)緩存、本地緩存和仿緩存(供開發(fā)時使用)等多種緩存模式,還支持使用自定義緩存后端,這些緩存方法各自有不同的特點和要求,需要你根據自身系統(tǒng)的特點選擇使用其中哪一種,并在Django配置文件中進行相應的設定,確保自身系統(tǒng)運轉高效[6]。

      利用緩存機制實現(xiàn)分頁的主要步驟如下:

      1)建立數據模型

      本文就以建立一個書籍信息的模型為例,其數據模型包含書籍的名字、作者、出版社、出版時間等信息。在models.py文件中,定義模型如下:

      from django.db import models

      class Book(models.Model):

      title = models.CharField(max_length=100)

      authors = models.CharField(max_length=100)

      publisher = models.CharField(max_length=50)

      publication_date = models.DateField()

      2)編寫視圖函數

      假設用戶可以從書名、作者、出版社等3個方面進行檢索,在視圖函數中首先創(chuàng)建一個搜索函數,先從類字典對象request.POST中讀取用戶發(fā)送的檢索條件,一般采用get()方法:

      title = request.POST.get('title','')

      authors = request.POST.get('authors','')

      publisher = request.POST.get('publisher','')

      在獲取用戶提交的檢索條件后,先對用戶的輸入進行判別,看其輸入是否全部為空、內容是否合法,否則返回錯誤提示信息。如果用戶的檢索條件正確,則使用“Book.objects.filter()”語句對數據庫進行檢索,如果設置的檢索條件過于復雜,可使用“Q”對象進行級聯(lián)查找。對數據庫進行檢索后獲得一個包含所有符合條件記錄的QuerySet,然后利用Django的緩存機制將其放入緩存中,以便在結果顯示頁面中能夠多次讀取。假設我們的結果集命名為books,將其放入緩存或讀出的方法如下:

      3)創(chuàng)建模板文件、進行url配置

      在模板文件夾下創(chuàng)建模板文件,用以獲取用戶輸入,顯示檢索分頁的結果或是錯誤信息,然后在urls.py文件中配置路徑信息。

      2.2 利用 Django Sessions框架

      利用Django的Sessions框架實現(xiàn)在Web服務層分頁與利用Django緩存機制實現(xiàn)這一功能方法基本相同,其主要區(qū)別是一個把查詢的結果利用緩存機制存放在緩存中,一個把查詢的結果利用Sessions框架存放在request.session字典中。

      利用Sessions框架實現(xiàn)分頁的步驟與利用緩存實現(xiàn)的步驟相同,只需將查尋結果存入緩存、從緩存讀取的語句改為從request.session字典中存取即可。

      要使用Django的Sessions框架,首先要檢查你工程下的配置文件,確保Sessions功能已經打開。之后,在視圖函數中就可以像字典一樣使用request.session對象。利用其存取查詢結果的方法分別為:

      3 在數據庫服務層分頁

      在這里,我們只研究存儲過程分頁的實現(xiàn)方法。存儲過程分頁,就是在數據層編寫一個存儲過程,并將要顯示頁的頁碼和每頁的尺寸作為存儲過程的輸入參數,這樣每次僅將查詢結果的一個子集通過Web服務器交付給用戶,減少了三層之間的數據流量從而提高了整個網絡的查詢性能[5]。其執(zhí)行過程如圖3所示。

      圖3 存儲過程分頁執(zhí)行過程示意圖Fig. 3 diagram of the implementation process of pagination in storage procedure

      3.1 定義存儲過程

      存儲過程是存儲在數據庫服務器上的一組預編譯的SQL語句,這些語句通常是一些需要頻繁操作的任務,它可以接收參數,返回狀態(tài)值,并且可以嵌套使用。在特定情況下,特別是使用頻率高、結構復雜的SQL語句使用存儲過程可以提高數據庫應用程序的執(zhí)行效率。以MySQL數據庫為例,我們可以定義一個存儲過程,接受表名、查詢字段、每頁記錄數、當前頁碼、排序條件、WHERE條件等參數,返回符合條件記錄總數和查詢結果集,定義過程如下:

      3.2 調用存儲過程

      在數據庫定義了存儲過程之后,就可以在Django框架中進行調用,調用時需要先獲取游標對象,然后使用“execute()”方法調用或使用“callproc()”方法進行調用,然后讀取查詢結果和輸出變量。調用存儲過程可以在視圖函數中直接進行,也可以通過自定義Manager方法調用。

      1)在視圖函數中直接調用

      以調用上面的存儲過程為例,我們取出所有記錄的第2頁,每頁10條記錄,數據表名為‘paging_book’:

      最后,還要在模型Book中加入語句“objects = BookManager()”,如果在視圖函數中導入了Book模型,就可以使用下面的語句對存儲過程進行調用,并獲得查詢結果和記錄總數:

      books,total_num=Book.objects.book_filter(page,num,condition)

      通過自定義Manager方法調用存儲過程可以在視圖函數中很方便的進行多次調用,而避免每次都要將調用代碼重寫。

      3.3 處理結果、發(fā)送給用戶

      根據調用存儲過程得到的查詢結果和總記錄數,可以計算出總頁數、頁碼索引范圍等內容,然后將其和查詢結果等內容傳送至模板上顯示給用戶,具體過程這里不再贅述。

      4 性能測試

      對上面幾種方法進行測試,分頁時每頁大小為5條記錄,結果總數分別為10~100 000條,利用Cache功能是采用內存緩存機制,具體結果如表1所示 。

      表1 測試結果Tab.1 The result of test

      5 結束語

      從上面的結果可以看出,當網站的數據量較小時,這幾種分頁方法差別不大,此時由于在Web層分頁實現(xiàn)方法比較簡單,可以考慮采用在Web層分頁的方法。但隨著網站數據量的增長,在數據庫層分頁的優(yōu)勢越發(fā)明顯,分頁效率明顯優(yōu)于在Web層分頁。特別是在Django框架中Session的值定義為“l(fā)ongtext”類型,在MySQL中此類型所能存儲的最大長度為4294967295(232-1)個字符,當查詢的結果集比較大會運行出錯,所以當查詢數據量比較大時不宜使用Session功能分頁。而利用自定義Manager方法和直接調用存儲過程兩種分頁方法的效率基本一樣,都可以大幅度提高Web查詢分頁的效率,但利用自定義Manager方法可簡化調用過程,并且方便多次調用。

      [1] 李光耀,易虎,李波.基于存儲過程分頁優(yōu)化Web數據查詢性能[J].微計算機應用,2004,25(4):476-479.LI Guang-yao,YI Hu,LI Bo. Performance-optimizing of querying web data based on paging in stored procedure[J].Microcomputer App lications,2004,25(4):476-479.

      [2] 王瑞波. 一種分頁查詢優(yōu)化方法的研究與實現(xiàn)[D].北京:北京化工大學, 2009.

      [3] 黃櫟橋,陸鑫.基于Struts框架的Web數據庫分頁技術[J].計算機應用,2008,8(z1):288-301.HUANG Li-qiao,LU Xin.Pagination technology of Web-based database using Struts framework[J].Journal of Computer Applications,2008,8(z1):288-301.

      [4] 岳國偉,梁永全,陳玉娥.ASP.NET中數據分頁技術的研究[J].計算機應用研究,2007,24(9):159-161.YUE Guo-wei,LIANG Yong-quan,CHEN Yu-e.Research of data paging technologies in ASP. NET[J].Applicatio Reseach of Computers,2007,24(9):159-161.

      [5] 王博,任濤.Web數據庫分頁瀏覽方法性能分析[J].現(xiàn)代電子技術,2006,29(10):68-70.WANG Bo, REN Tao.Performance analysis of web database paging browse methods[J].Modern Electronics Technique,2006,29(10):68-70.

      [6] Jeff Forcier,Paul Bissex,Wesley Chun.Django Web開發(fā)指南[M].許旭銘,等譯. 北京:機械工業(yè)出版社, 2009.

      猜你喜歡
      數據量調用框架
      框架
      基于大數據量的初至層析成像算法優(yōu)化
      計算Lyapunov指數的模糊C均值聚類小數據量法
      高刷新率不容易顯示器需求與接口標準帶寬
      廣義框架的不相交性
      寬帶信號采集與大數據量傳輸系統(tǒng)設計與研究
      電子制作(2019年13期)2020-01-14 03:15:18
      核電項目物項調用管理的應用研究
      LabWindows/CVI下基于ActiveX技術的Excel調用
      測控技術(2018年5期)2018-12-09 09:04:46
      WTO框架下
      法大研究生(2017年1期)2017-04-10 08:55:06
      基于系統(tǒng)調用的惡意軟件檢測技術研究
      诸城市| 钦州市| 海淀区| 建德市| 边坝县| 黄龙县| 翼城县| 天长市| 西林县| 金川县| 萨嘎县| 腾冲县| 拉孜县| 天全县| 广元市| 来凤县| 罗定市| 汝州市| 淳安县| 城固县| 南京市| 巴林右旗| 泽库县| 安丘市| 山阳县| 临朐县| 铜川市| 江源县| 刚察县| 资兴市| 呼伦贝尔市| 乐亭县| 潮安县| 吴桥县| 思南县| 固安县| 温州市| 长宁县| 买车| 南丰县| 芒康县|