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

基于Hibernate OGM的SQL與NoSQL數(shù)據(jù)庫的統(tǒng)一訪問模型的設(shè)計與實現(xiàn)

2016-12-15 02:47:06李東奎鄂海紅
軟件 2016年11期
關(guān)鍵詞:數(shù)據(jù)庫模型

李東奎,鄂海紅

(北京郵電大學(xué),北京 海淀 100876)

基于Hibernate OGM的SQL與NoSQL數(shù)據(jù)庫的統(tǒng)一訪問模型的設(shè)計與實現(xiàn)

李東奎,鄂海紅

(北京郵電大學(xué),北京 海淀 100876)

針對將現(xiàn)有的關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫都有自己的專用API的應(yīng)用場景,借助于開源框架Hibernate OG建立了一個統(tǒng)一的存儲SQL數(shù)據(jù)庫和非NoSQL數(shù)據(jù)庫的框架,使其對這兩種數(shù)據(jù)庫的讀寫能在一個框架下按照統(tǒng)一的規(guī)則進(jìn)行,無需進(jìn)行額外的API查看。通過使用JAVA的注解區(qū)別數(shù)據(jù)庫類型、JAVA對象填充數(shù)據(jù)、Hibernate OGM框架自動將JAVA對象解析成點分格式、底層通過原生API封裝寫入數(shù)據(jù)庫的引擎。針對混合使用HBase和MySQL的場景,對以上統(tǒng)一訪問模型進(jìn)行了實驗和驗證。實驗表明,通過JAVA注解區(qū)分?jǐn)?shù)據(jù)庫類型,通過JAVA對象填充數(shù)據(jù),通過Hibernate OGM統(tǒng)一解析數(shù)據(jù)存儲數(shù)據(jù)的這一系列的操作來進(jìn)行對SQL和NoSQL數(shù)據(jù)庫的方案是可行的。

HBase;MySQL;數(shù)據(jù)庫

本文著錄格式:李東奎,鄂海紅. 基于Hibernate OGM的SQL與NoSQL數(shù)據(jù)庫的統(tǒng)一訪問模型的設(shè)計與實現(xiàn)[J].軟件,2016,37(11):14-18

0 引言

伴隨著如今互聯(lián)網(wǎng)行業(yè)的高速發(fā)展,各種數(shù)據(jù)格式層出不窮,從而產(chǎn)生了能適應(yīng)各種不同類型數(shù)據(jù)的數(shù)據(jù)庫。由于最開始的數(shù)據(jù)較為簡單且有一定規(guī)律可循,所以從誕生了最開始的關(guān)系型數(shù)據(jù)庫,比如MySQL、PostgreSQL和SQLServer仍然被廣泛使用。隨著互聯(lián)網(wǎng)浪潮的繼續(xù)推進(jìn)和大數(shù)據(jù)時代的到來,要處理的數(shù)據(jù)不再是簡單的扁平數(shù)據(jù)了,而是大量如Key-Value型、JSON型、XML型等新的數(shù)據(jù)類型,從而產(chǎn)生了HBase、MongoDB、Redis等類型的數(shù)據(jù)庫來適應(yīng)新的數(shù)據(jù)類型[1]。NoSQL數(shù)

據(jù)庫不同于傳統(tǒng)的數(shù)據(jù)庫的重要區(qū)別,就是面向文檔、圖形、鍵值對、對象等存儲方式,更適合存儲某些特定類型的數(shù)據(jù)[2],其使用也成為一種潮流和趨勢。因此在本文中,提到的NoSQL[3]數(shù)據(jù)即為非關(guān)系型數(shù)據(jù)庫,提到的SQL數(shù)據(jù)庫即為關(guān)系型數(shù)據(jù)庫。

雖然現(xiàn)有的NoSQL數(shù)據(jù)庫經(jīng)過了十幾年的發(fā)展,已經(jīng)擁有了初步的使用規(guī)模,表現(xiàn)良好,但是SQL數(shù)據(jù)庫經(jīng)歷了數(shù)十年的研究和性能優(yōu)化,很多數(shù)據(jù)都可以使用SQL數(shù)據(jù)庫進(jìn)行很好的建模,所以關(guān)系型數(shù)據(jù)庫不能完全被相對不成熟的NoSQL數(shù)據(jù)庫替代和舍棄[4]。而對于實際使用的數(shù)據(jù)需要存入數(shù)據(jù)庫時,需要判斷其適合使用SQL數(shù)據(jù)庫還是NoSQL數(shù)據(jù)庫,然后使用不同的API訪問,需要花費(fèi)大量的時間去調(diào)研研究各種不同數(shù)據(jù)庫的API使用,尤其是現(xiàn)在NoSQL數(shù)據(jù)庫和SQL數(shù)據(jù)庫的編程模型差異性非常大,增加了編程難度,降低了開發(fā)速度。

SQL數(shù)據(jù)和NoSQL數(shù)據(jù)庫的訪問沒有統(tǒng)一的訪問模型。而使用原生的數(shù)據(jù)庫訪問API將增加應(yīng)用的復(fù)雜性并降低開發(fā)效率和可維護(hù)性。為了克服上述缺點,有必要提出一種解決方案,允許開發(fā)人員無論對于SQL型數(shù)據(jù)庫還是NoSQL數(shù)據(jù)庫使用統(tǒng)一的編程模型進(jìn)行數(shù)據(jù)庫的訪問,不需要了解底層數(shù)據(jù)庫的編程細(xì)節(jié),這既具有理論意義,又具有使用價值。

本文提出的關(guān)系型數(shù)據(jù)庫與非關(guān)系型數(shù)據(jù)庫的統(tǒng)一訪問模型旨在為SQL和NoSQL存儲提供統(tǒng)一的編程訪問模型,在HBase[5]和MySQL的數(shù)據(jù)庫之間架起一座橋梁屏蔽底層的數(shù)據(jù)庫的編程模型的差異,即為開發(fā)人員提供一個屏蔽底層的分離的數(shù)據(jù)源的訪問解決方案。

1 基于HibernateOGM的SQL和NoSQL的統(tǒng)一訪問模型的設(shè)計

1.1 HibernateOGM介紹

Hibernate Object/Grid Mapper(OGM)[6]這個項目能夠為NoSQL數(shù)據(jù)庫提供Java Persistence(JPA)支持。它復(fù)用了Hibernate Core引擎將實體持久化至NoSQL數(shù)據(jù)存儲中,而不是關(guān)系型數(shù)據(jù)庫中。它還復(fù)用了Java Persistence Query Language(JP-QL)來搜索數(shù)據(jù)。

通過重寫Datastore provider和GridDialect,使得Hibernate OGM擁有訪問HBase的能力,實現(xiàn)的原理如下,將非結(jié)構(gòu)化壓縮成結(jié)構(gòu)化的數(shù)據(jù)。在Hiberante OGM框架中,Datastore provider扮演了數(shù)據(jù)提供者的角色,任何SQL或者NoSQL數(shù)據(jù)庫,都可以通過重寫Datastore provider來定制自己的數(shù)據(jù)庫訪問方式,因此,可以通過改寫Datastore provider來定制框架,使框架擁有訪問HBase的能力。

圖1 Hibernate OGM架構(gòu)圖Fig.1 HibernateOGM Structure

1.2 JAVA注解

Annotation(注解)是JDK1.5及以后版本引入的。它可以用于創(chuàng)建文檔,跟蹤代碼中的依賴性,甚至執(zhí)行基本編譯時檢查。注解是以‘@注解名’在代碼中存在的,根據(jù)注解參數(shù)的個數(shù),我們可以將注解分為:標(biāo)記注解、單值注解、完整注解三類。它們都不會直接影響到程序的語義,只是作為注解(標(biāo)識)存在,我們可以通過反射機(jī)制編程實現(xiàn)對這些元數(shù)據(jù)(用來描述數(shù)據(jù)的數(shù)據(jù))的訪問。另外,你可以在編譯時選擇代碼里的注解是否只存在于源代碼級,或者它也能在class文件、或者運(yùn)行時中出現(xiàn)(SOURCE/CLASS/RUNTIME)。

通過為類添加注解,可以在程序運(yùn)行時查看某一個對象的注解對應(yīng)哪個數(shù)據(jù)庫,從而實現(xiàn)了程序自動建立對象和數(shù)據(jù)庫之間的聯(lián)系。

1.3 模型架構(gòu)

此部分,介紹模型的架構(gòu)和架構(gòu)的中間件的功能。本架構(gòu)中包含如下中間件:模型解析器、數(shù)據(jù)源分離策略的HBase模型處理器、數(shù)據(jù)源分離策略的MySQL模型處理器。模型架構(gòu)如下圖2所示。

1.3.1 mode parser

此部分為模型架構(gòu)的模型解析器,當(dāng)架構(gòu)存儲

數(shù)據(jù)時,會傳遞JAVA BEAN給mode parser模塊,此模塊判斷運(yùn)行時判斷JAVA BEAN的注解信息,根據(jù)注解信息即可判斷此JAVA BEAN中包含的數(shù)據(jù)將要被傳送到哪個數(shù)據(jù)庫,然后將此JAVA BEAN傳遞到相應(yīng)的MO DE。此模塊是整個數(shù)據(jù)訪問流的中轉(zhuǎn)模塊。當(dāng)讀取數(shù)據(jù)時,此模塊負(fù)責(zé)將數(shù)據(jù)與相應(yīng)的JAVA BEAN做轉(zhuǎn)換。

圖2 模型架構(gòu)圖Fig.2 Mode Structure

1.3.2 HBase mode

此模塊用于模型框架對于HBase的讀取和寫入操作,對于原生的HBase的API做了一次封裝,使得框架上層傳送的數(shù)據(jù)能夠訪問HBase數(shù)據(jù)庫。

Insert handler:此模塊用于執(zhí)行框架數(shù)據(jù)插入HBase數(shù)據(jù),根據(jù)框架上層傳送的JAVA BEAN,此模塊可以解析出將要插入的數(shù)據(jù)庫表的名稱,然后根據(jù)相應(yīng)的插入邏輯,執(zhí)行底層的實際的插入HBase數(shù)據(jù)的操作。

Delete handler:此模塊用于執(zhí)行框架數(shù)據(jù)刪除HBase的數(shù)據(jù),根據(jù)框架上層傳送的JAVA BEAN,從模塊可以解析出將要刪除的數(shù)據(jù)的表的名稱、ROWKEY,然后根據(jù)相應(yīng)的刪除邏輯,執(zhí)行底層的實際的刪除HBase數(shù)據(jù)的操作。

Read Handler:此模塊用于執(zhí)行框架數(shù)據(jù)的讀取查詢HBase的數(shù)據(jù),根據(jù)框架上層傳送的JAVA BEAN,從模塊可以解析出將要讀取的數(shù)據(jù)的表的名稱、ROWKEY,然后根據(jù)相應(yīng)的讀取邏輯,執(zhí)行底層的實際的讀取數(shù)據(jù)的操作。

1.3.3 MySQL mode

此模塊用于模型框架對于MySQL的讀取和寫入操作,對于原生的MySQL的API做了一次封裝,使得框架上層傳送的數(shù)據(jù)能夠訪問HBase數(shù)據(jù)庫。

Insert handler:此模塊用于執(zhí)行框架數(shù)據(jù)插入HBase數(shù)據(jù)。根據(jù)傳遞的信息,解析出數(shù)據(jù)庫名稱,執(zhí)行MYSQL數(shù)據(jù)庫的插入。

Delete handler:此模塊用于執(zhí)行框架數(shù)據(jù)插入HBase數(shù)據(jù)。根據(jù)傳遞的信息,解析出數(shù)據(jù)庫和PRIMARY KEY,執(zhí)行MYSQL數(shù)據(jù)庫的刪除。

Read Handler:此模塊用于執(zhí)行框架數(shù)據(jù)的讀取查詢HBase的數(shù)據(jù),根據(jù)傳遞的信息,從模塊可以解析出將要讀取的數(shù)據(jù)的表的名稱、PRIMARY,KEY,然后根據(jù)相應(yīng)的讀取邏輯,執(zhí)行底層的實際的讀取數(shù)據(jù)的操作。

2 模型實現(xiàn)

此模塊主要介紹次模型框架的實現(xiàn)思路和原理。中間件的實現(xiàn)是通過使用Java語言,HBase API和JDBC API來創(chuàng)建平臺類。中間件層的所有接口都封裝在Platform Class中。在加載過程中,Platform Class首先讀取記錄HBase和MySQL信息的配置文件,來實現(xiàn)和HBase、MySQL數(shù)據(jù)通信來驗證配置信息中的數(shù)據(jù)庫信息。其次,調(diào)用配置模塊進(jìn)行存儲平臺的配置,主要包括HBase的初始化,創(chuàng)建作為Platform類的靜態(tài)變量的MySQL連接池,映射關(guān)系用于完成HBase和MySQL的數(shù)據(jù)關(guān)聯(lián)。然后,用戶程序可以通過調(diào)用由搜索模塊,讀取模塊,寫入模塊和刪除模塊提供的接口來操作數(shù)據(jù)。這些接口遵循數(shù)據(jù)關(guān)聯(lián)模塊中定義的規(guī)則,確保HBase和MySQL中的數(shù)據(jù)關(guān)聯(lián)。框架的加載到運(yùn)行流程圖如下圖3所示:

圖3 模型加載流程Fig.3 Mode load process

2.1 mode parser模塊的實現(xiàn)

框架可以動態(tài)識別傳遞來的BEAN所屬的數(shù)據(jù)

庫,原理是使用了JAVA annotation,通過動態(tài)解析,可以減少框架的配置量,實現(xiàn)過程如下圖4所示:

圖4 mode parser流程Fig.4 mode parser process

2.2 HBase mode模塊的實現(xiàn)

此模塊重寫了Datastore provider和GridDialect,使得Hibernate OGM擁有訪問HBase的能力,實現(xiàn)的原理如下,將非結(jié)構(gòu)化壓縮成結(jié)構(gòu)化的數(shù)據(jù)。在Hiberante OGM框架中,Datastore provider扮演了數(shù)據(jù)提供者的角色,任何SQL或者NoSQL數(shù)據(jù)庫,都可以通過重寫Datastore provider來定制自己的數(shù)據(jù)庫訪問方式,因此,可以通過改寫Datastore provider來定制框架,使框架擁有訪問HBase的能力。對數(shù)據(jù)庫的操作主要是CURD操作,GridDialect作為一個JAVA基類,通過繼承并拓展重寫,可以派生出對某一個特定數(shù)據(jù)庫的CURD操作,重寫GridDialect某一個函數(shù)就是拓展改寫訪問數(shù)據(jù)庫的一種功能,在GridDialect類中定義了豐富的可被改寫的可繼承的函數(shù),通過這些函數(shù)完成了拓展改寫數(shù)據(jù)庫CURD的能力??傊?,通過Datastore provider和 GridDialect完了對某一特定數(shù)據(jù)庫,特定數(shù)據(jù)庫的操作的編程。

2.2.1 Delete handler模塊的實現(xiàn)

這個接口的輸入是一個JAVA BEAN,輸出是成功還是失敗。接口遵循數(shù)據(jù)關(guān)聯(lián)模塊規(guī)則:HBase的表名對應(yīng)于JAVA BEAN的對象名,HBase的列族名對應(yīng)于JAVA BEAN中的內(nèi)嵌對象的名字,HBase列族里的KEY名稱對應(yīng)于JAVA BEAN內(nèi)嵌對象的成員名;MySQL表明對應(yīng)于JAVA BEAN對象名,列名對應(yīng)BEAN中的成員變量名。因此刪除一行數(shù)據(jù),需要ROWKEY和表名。刪除流程如下圖5所示:

圖5 Delete handler流程Fig.5 delete handler process

2.2.2 Insert handler模塊的實現(xiàn)

這個接口的輸入是一個JAVA BEAN,輸出是成功還是失敗。接口遵循數(shù)據(jù)關(guān)聯(lián)模塊規(guī)則:HBase的表名對應(yīng)于JAVA BEAN的對象名,HBase的列族名對應(yīng)于JAVA BEAN中的內(nèi)嵌對象的名字,HBase列族里的KEY名稱對應(yīng)于JAVA BEAN內(nèi)嵌對象的成員名;MySQL表明對應(yīng)于JAVA BEAN對象名,列名對應(yīng)BEAN中的成員變量名。默認(rèn)情況下,HBase和MySQL存儲相同的數(shù)據(jù)模式。插入模塊運(yùn)行時流程如下圖6所示:

圖6 Insert handler流程Fig.6 Insert handler process

2.2.3 Read handler模塊的實現(xiàn)

存儲平臺的讀模塊負(fù)責(zé)從HBase讀取數(shù)據(jù)。 它包括讀取HBase表的所有數(shù)據(jù),讀取HBase表的行數(shù)據(jù)的接口和讀取對應(yīng)于HBase表的MySQL表的所有記錄的接口。讀取模塊運(yùn)行時流程如下圖7所示:

圖7 Read handler流程Fig.7 read handler process

2.3 MySQL mode模塊的實現(xiàn)

MySQLMode的實現(xiàn),與HBase mode的實現(xiàn)大同小異。MySQL的數(shù)據(jù)格式固定,所以數(shù)據(jù)被HibernateOGM轉(zhuǎn)換后是標(biāo)準(zhǔn)的“表名.列名”的格式,分割后可以解析出表名和列名,然后交由需要的處理邏輯進(jìn)行處理。

Insert handler:此模塊用于執(zhí)行框架數(shù)據(jù)插入HBase數(shù)據(jù)。根據(jù)傳遞的信息,解析出數(shù)據(jù)庫名稱,執(zhí)行MYSQL數(shù)據(jù)庫的插入。

Delete handler:此模塊用于執(zhí)行框架數(shù)據(jù)插入HBase數(shù)據(jù)。根據(jù)傳遞的信息,解析出數(shù)據(jù)庫和PRIMARY KEY,執(zhí)行MYSQL數(shù)據(jù)庫的刪除。

Read Handler:此模塊用于執(zhí)行框架數(shù)據(jù)的讀取查詢HBase的數(shù)據(jù),根據(jù)傳遞的信息,從模塊可以解析出將要讀取的數(shù)據(jù)的表的名稱、PRIMARY,KEY,然后根據(jù)相應(yīng)的讀取邏輯,執(zhí)行底層的實際的讀取數(shù)據(jù)的操作。

3 結(jié)論

本文闡釋了基于HibernateOGM框架的SQL和NoSQL統(tǒng)一訪問架構(gòu)的設(shè)計與實現(xiàn),該訪問模型理論上適用于任一種SQL數(shù)據(jù)庫和NoSQL數(shù)據(jù)庫,并選定HBase和MySQL對框架進(jìn)行了完整實現(xiàn),通過框架提出的mode parser,實現(xiàn)了統(tǒng)一訪問中的NoSQL數(shù)據(jù)和MySQL中的SQL數(shù)據(jù)。簡化了編程模式,開發(fā)人員只需專注于數(shù)據(jù)的格式定義,并給出相應(yīng)的BEAN并在BEAN標(biāo)明注解即可,提高了開發(fā)效率和可維護(hù)性。但面對海量數(shù)據(jù)的查詢,該查詢模型的查詢效率還需 進(jìn)一步改進(jìn)和優(yōu)化??偟膩碚f,該統(tǒng)一查詢模型出的理論框架是可行的,達(dá)到了預(yù)期的效果。

致謝(可選)

感謝我的指導(dǎo)老師鄂海紅老師的全心指導(dǎo),用心關(guān)懷。鄂海紅老師積極勤奮,性格開朗,思維嚴(yán)謹(jǐn),工作認(rèn)真負(fù)責(zé),在學(xué)術(shù)上出類拔萃。鄂海紅老師在日常生活和學(xué)習(xí)中給我無微不至的照顧,并且從畢業(yè)論文的開題到最終答辯,一直給我悉心指導(dǎo),提出寶貴的意見。鄂海紅老師認(rèn)真負(fù)責(zé)的態(tài)度、積極勤奮的品格,都將成為我以后人生路上學(xué)習(xí)的榜樣。感謝所有本文參考文獻(xiàn)的作者們,你們的研究給了我很多啟發(fā),對本文的研究有莫大的幫助。

[1] Stonebraker M. SQL databases v. NoSQL databases. Communications of the ACM, 2010, 53(4): 10-11.

[2] Rick Cattell. Scalable SQL and NoSQL Data Stores.ACM Special Interest Group on Management of Data. New York, 2010: 12-27.

[3] Stonebraker M. New sql: An alternative to nosql and old sql for new oltp apps. 2011.

[4] Brynko B. NuoDB: Reinventing the Database. Information Today, 2012, 29(9): 9-9.

[5] Hbase 0.95-SNAPSHOT Reference. http://hbase.apache.org/ xref/index.html.

[6] http://hibernate.org/ogm/

Design and Implementation of Relation Database and Non-Relation Database Unified Access Model Based on HibernateOGM

LIU Dong-kui E Hai-hong
(2. School of Computer Science, Beijing University of Posts and Telecommunications, Beijing 100876, China)

For the existing relational database and non-relational database has its own application-specific API scenarios, with the help of open-source framework Hibernate OG to establish a unified storage SQL database and non-NoSQL database framework, so that both of them Database read and write in a framework in accordance with the unified rules, without additional API view. Through the use of JAVA annotation distinction between the database type, JAVA object to fill data, Hibernate OGM framework automatically JAVA object analysis into point format, the underlying API package written by the original database engine. For the mixed use of HBase and MySQL scenarios, the above uniform access model for the experiment and validation. Experiments show that it is feasible to distinguish database types by JAVA annotation, populate data with JAVA objects, and unify database data storage through Hibernate OGM to implement SQL and NoSQL database.

HBase; MySQL; Database

TP311.13

A

10.3969/j.issn.1003-6970.2016.11.004

國家科技支撐計劃(2014BAK15B01)。

李東奎(1992-),男,碩士研究生,HBase存儲研究。

鄂海紅,副教授,主要研究方向:大數(shù)據(jù)及個性化推薦系統(tǒng)。

猜你喜歡
數(shù)據(jù)庫模型
一半模型
重要模型『一線三等角』
重尾非線性自回歸模型自加權(quán)M-估計的漸近分布
數(shù)據(jù)庫
財經(jīng)(2017年15期)2017-07-03 22:40:49
數(shù)據(jù)庫
財經(jīng)(2017年2期)2017-03-10 14:35:35
3D打印中的模型分割與打包
數(shù)據(jù)庫
財經(jīng)(2016年15期)2016-06-03 07:38:02
數(shù)據(jù)庫
財經(jīng)(2016年3期)2016-03-07 07:44:46
數(shù)據(jù)庫
財經(jīng)(2016年6期)2016-02-24 07:41:51
FLUKA幾何模型到CAD幾何模型轉(zhuǎn)換方法初步研究
主站蜘蛛池模板: 国产大片黄在线观看| 亚洲人网站| 色噜噜综合网| 在线观看av永久| www.亚洲国产| 福利视频99| 韩日免费小视频| 中文字幕亚洲另类天堂| 天堂在线亚洲| 成人亚洲视频| 毛片网站观看| 一本大道东京热无码av| 久久精品人人做人人爽电影蜜月| 人与鲁专区| 精品福利视频网| 国产精品自在在线午夜区app| 永久免费AⅤ无码网站在线观看| 久夜色精品国产噜噜| 日韩av在线直播| 人妻丰满熟妇av五码区| 综合五月天网| 国产香蕉在线视频| 日本久久久久久免费网络| 欧美色香蕉| 国产精品亚洲精品爽爽| 亚洲人成在线精品| 国产美女视频黄a视频全免费网站| 99久久国产综合精品2023| 国产精品一区二区不卡的视频| 国产SUV精品一区二区| 久久久久无码精品| 深夜福利视频一区二区| 波多野结衣无码中文字幕在线观看一区二区| 91亚洲视频下载| 久久综合九九亚洲一区| 在线国产你懂的| 欧美全免费aaaaaa特黄在线| 亚洲第一黄片大全| 99在线视频网站| 一级毛片中文字幕| 欧美翘臀一区二区三区| 国产精品免费露脸视频| 欧美亚洲国产视频| 在线亚洲小视频| 亚洲AV无码乱码在线观看代蜜桃| 97se亚洲综合不卡| 伊在人亚洲香蕉精品播放 | 国产chinese男男gay视频网| 2020极品精品国产 | 91破解版在线亚洲| 国产精品尹人在线观看| 国产女人在线观看| 亚洲第一天堂无码专区| 91免费精品国偷自产在线在线| 97一区二区在线播放| 国产女人在线视频| 国产极品美女在线| 18禁影院亚洲专区| 日本欧美午夜| 在线播放91| 国产男人的天堂| 国产浮力第一页永久地址| 成人午夜网址| 日韩欧美国产区| 在线观看精品自拍视频| 精品久久久久久久久久久| 好吊色妇女免费视频免费| 亚洲国产精品国自产拍A| 激情成人综合网| 在线观看免费AV网| 国产在线精品99一区不卡| 一级毛片在线播放| 亚洲丝袜中文字幕| 毛片一级在线| 国产精品大白天新婚身材| 国产va在线| 少妇露出福利视频| 91精品国产一区自在线拍| 欧美综合中文字幕久久| 欧美三級片黃色三級片黃色1| 精品人妻一区二区三区蜜桃AⅤ| 九九久久精品国产av片囯产区|