999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

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

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

齊金剛,李 滔,李晉軍

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

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

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

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

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

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

1.1 在客戶層分頁

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

1.2 在Web服務層分頁

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

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

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

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

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

1.3 在數據庫服務層分頁

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

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

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

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

2 在Web服務層分頁

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

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

2.1 利用Django緩存機制

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

利用緩存機制實現分頁的主要步驟如下:

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個方面進行檢索,在視圖函數中首先創建一個搜索函數,先從類字典對象request.POST中讀取用戶發送的檢索條件,一般采用get()方法:

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

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

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

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

3)創建模板文件、進行url配置

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

2.2 利用 Django Sessions框架

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

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

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

3 在數據庫服務層分頁

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

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

3.1 定義存儲過程

存儲過程是存儲在數據庫服務器上的一組預編譯的SQL語句,這些語句通常是一些需要頻繁操作的任務,它可以接收參數,返回狀態值,并且可以嵌套使用。在特定情況下,特別是使用頻率高、結構復雜的SQL語句使用存儲過程可以提高數據庫應用程序的執行效率。以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 處理結果、發送給用戶

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

4 性能測試

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

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

5 結束語

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

[1] 李光耀,易虎,李波.基于存儲過程分頁優化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] 王瑞波. 一種分頁查詢優化方法的研究與實現[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].現代電子技術,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開發指南[M].許旭銘,等譯. 北京:機械工業出版社, 2009.

猜你喜歡
數據庫利用用戶
利用min{a,b}的積分表示解決一類絕對值不等式
中等數學(2022年2期)2022-06-05 07:10:50
利用一半進行移多補少
利用數的分解來思考
Roommate is necessary when far away from home
數據庫
財經(2017年2期)2017-03-10 14:35:35
關注用戶
商用汽車(2016年11期)2016-12-19 01:20:16
關注用戶
商用汽車(2016年6期)2016-06-29 09:18:54
數據庫
財經(2016年15期)2016-06-03 07:38:02
關注用戶
商用汽車(2016年4期)2016-05-09 01:23:12
數據庫
財經(2016年3期)2016-03-07 07:44:46
主站蜘蛛池模板: 亚洲国产欧美国产综合久久| 国产精品嫩草影院av| 丁香六月激情综合| 国产精品久久国产精麻豆99网站| 亚洲天堂自拍| 亚洲网综合| 国产主播福利在线观看 | 日本人妻丰满熟妇区| 婷婷久久综合九色综合88| 亚洲av无码成人专区| 久久精品国产999大香线焦| 亚洲人成色在线观看| 中文字幕啪啪| 婷婷激情亚洲| 在线精品自拍| 999国产精品永久免费视频精品久久 | 91麻豆精品视频| 亚洲欧美日韩久久精品| 亚洲精品无码抽插日韩| 亚洲精品视频在线观看视频| 亚洲中久无码永久在线观看软件| 国产成人高清在线精品| 免费国产小视频在线观看| 亚洲伦理一区二区| 亚洲国产中文精品va在线播放| 青青青草国产| 免费欧美一级| 久久99久久无码毛片一区二区| 国产成人综合久久| 国产精品久久久久久久久| 亚洲欧洲日韩久久狠狠爱| 九九九久久国产精品| 亚洲色图欧美| 在线综合亚洲欧美网站| 国产欧美综合在线观看第七页| 九色综合伊人久久富二代| 一区二区在线视频免费观看| 免费在线观看av| 欧美精品成人| 国产成人在线无码免费视频| 精品人妻无码区在线视频| 国产精品吹潮在线观看中文| 免费在线a视频| 欧美成人免费一区在线播放| 欧美一级高清片欧美国产欧美| 亚洲人成日本在线观看| 色婷婷电影网| 国产日韩欧美中文| 中文精品久久久久国产网址| 欧美成人一区午夜福利在线| 99激情网| 国产不卡在线看| 极品私人尤物在线精品首页 | 久久人体视频| a色毛片免费视频| 国产在线观看一区精品| Aⅴ无码专区在线观看| 亚洲制服中文字幕一区二区| 国产精品三级av及在线观看| 久久精品一品道久久精品| 97影院午夜在线观看视频| 国产在线精彩视频二区| 国产高清无码麻豆精品| 五月天天天色| 亚洲伊人电影| 国产成人免费高清AⅤ| 无码日韩人妻精品久久蜜桃| 国产美女精品一区二区| 日韩精品一区二区三区视频免费看| 久久黄色视频影| 丁香五月激情图片| 国产永久免费视频m3u8| 玖玖精品视频在线观看| 九九热这里只有国产精品| 亚洲男人在线天堂| 欧美高清日韩| 精品少妇人妻av无码久久| 精品视频一区二区三区在线播| 亚洲日本在线免费观看| 波多野吉衣一区二区三区av| 亚洲永久免费网站| 亚洲日本在线免费观看|