精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

沒想到你是這樣的JDBC

開發(fā) 開發(fā)工具
本文將介紹 MySQL Client 與 Server 的通信原理,以及 Java JDBC 的工作原理等。什么是JDBC 的 Type4,什么又是 Type 3?

本文將介紹 MySQL Client 與 Server 的通信原理,以及 Java JDBC 的工作原理等。什么是JDBC 的 Type4,什么又是 Type 3? 

一、 MySQL Client & Server

我們在進(jìn)行數(shù)據(jù)庫的操作時,總是通過 GUI 數(shù)據(jù)管理工具,或者命令行連接到 MySQL 的 Server 上,然后進(jìn)行一系列數(shù)據(jù)庫的創(chuàng)建、表與表內(nèi)數(shù)據(jù)的操作等。

這個時候,這一系列 GUI管理工具,或者命令行,都是一個 MySQL 的 Client, 然后將 Client 的一系列操作命令,發(fā)送給 Server。 這里在發(fā)送時,Client 的命令都是根據(jù) MySQL 規(guī)范,生成的一個個packet進(jìn)行發(fā)送。

更直觀的理解, MySQL 的 Client 和 Server 相當(dāng)于是 Socket 通信中的一個 Client 與 Server, 彼此按照約定的協(xié)議格式進(jìn)行通信。

二、 JDBC 是什么?

什么是 JDBC 呢? 你一定會脫口而出,不就是通過它連庫嘛。 這么理解只是其中的一小部分,「灑灑水的啦」。

JDBC 全稱:The Java Database Connectivity,要從兩個方面來理解。

  • API
  • Driver

API , 首先是一個標(biāo)準(zhǔn),并不針對特定的數(shù)據(jù)庫,做為一個高層抽象,提供Java 語言與眾多數(shù)據(jù)庫之間的連通。 通過JDBC API,我們不再需要根據(jù)不同的數(shù)據(jù)庫使用不同的操作方式,而是以一種標(biāo)準(zhǔn)的操作,實現(xiàn)『Write Once, Run anywhere』。

既然 API 是個標(biāo)準(zhǔn),就需要有相對應(yīng)的實現(xiàn), 這里的 Driver 就是各個數(shù)據(jù)庫廠商根據(jù)標(biāo)準(zhǔn)進(jìn)行的針對實現(xiàn)。這也是為什么在應(yīng)用開發(fā)時,連MySQL 使用 MySQL 的 connector,連接 Oracle 使用 Oracle 的驅(qū)動的原因。

畢竟如何和自己廠家的數(shù)據(jù)庫交互,只有各個廠商自己清楚,所以根據(jù)標(biāo)準(zhǔn),各個廠商開發(fā)自己的 Connector。

下圖來自官方文檔,來描述 JDBC 的作用以及請求中所處的位置。

 JDBC 的作用以及請求中所處的位置

圖的左側(cè),也稱為Type4, 是通過Driver 直接連接數(shù)據(jù)庫 Server。這種也是最常用的,通過Driver ,將JDBC 的請求轉(zhuǎn)成數(shù)據(jù)庫服務(wù)器可以識別的協(xié)議格式。

圖的右側(cè), 稱為Type 3 是通過Driver,將JDBC 的請求轉(zhuǎn)成 中間件的協(xié)議格式。

以MySQL為例,看到這里我們發(fā)現(xiàn),其實 JDBC 的操作,本質(zhì)上相當(dāng)于是一個 MySQL 的 Client,通過 Driver,把應(yīng)用里的查詢、刪除等操作「翻譯」成了 MySQL Server 可識別的協(xié)議格式,再傳遞過去執(zhí)行。

所以,整個JDBC 做的事情可以歸結(jié)為以下三件:

  1. 創(chuàng)建數(shù)據(jù)庫連接
  2. 發(fā)送 SQL statement
  3. 處理請求結(jié)果

JDBC 總結(jié)起來的兩個部分,數(shù)據(jù)庫服務(wù)提供方,開發(fā)XXXDriver, 應(yīng)用開發(fā)者使用Driver 連接數(shù)據(jù)庫,進(jìn)行數(shù)據(jù)庫操作。

這樣應(yīng)用開發(fā)者就不需要關(guān)心底層與數(shù)據(jù)庫交互時的協(xié)議實現(xiàn),如何進(jìn)行請求連接,交互等,可以更專心到自己的業(yè)務(wù)。 否則,每個開發(fā)者都需要處理一次和數(shù)據(jù)交互的協(xié)議,繁瑣而且不易,重復(fù)勞動。

三、MySQL connector-J 部分源碼

有了上述的「理論」知識后,我們來看點干的。 MySQL 的驅(qū)動包是開源的,我們可以很方便的進(jìn)行下載了解實現(xiàn)。

最傳統(tǒng)的 JDBC 使用,一般都是通過以下這種方式:

  • Connection c = DriverManager.getConnection(url, user,pwd);
  • Statement stmt = c.createStatment
  • stmt.executeQuery 拿結(jié)果

getConnection的時候一般都需要提供一個URL,這個URL也都是固定寫法,比如mysql的是 jdbc:mysql://,這一部分是按照規(guī)范,同時在Driver的代碼里,通過解析URL獲取要連接到的主機(jī),端口,以及其他的連接參數(shù)。

  1. public Properties parseURL(String url, Properties defaults) throws java.sql.SQLException { 
  2.         Properties urlProps = (defaults != null) ? new Properties(defaults) : new Properties(); 
  3.         if (url == null) { 
  4.             return null; 
  5.         } 
  6.         if (!StringUtils.startsWithIgnoreCase(url, URL_PREFIX) && !StringUtils.startsWithIgnoreCase(url, MXJ_URL_PREFIX) 
  7.                 && !StringUtils.startsWithIgnoreCase(url, LOADBALANCE_URL_PREFIX) && !StringUtils.startsWithIgnoreCase(url, REPLICATION_URL_PREFIX)) { 
  8.             return null; 
  9.         } 
  10.         int beginningOfSlashes = url.indexOf("//"); 
  11.         if (StringUtils.startsWithIgnoreCase(url, MXJ_URL_PREFIX)) { 
  12.             urlProps.setProperty("socketFactory", "com.mysql.management.driverlaunched.ServerLauncherSocketFactory"); 
  13.         } 

看這一部分源碼可以發(fā)現(xiàn),除了我們常用的url配置,還可以在其中進(jìn)行l(wèi)oadbalance的配置等等。長了見識。

  1. DriverManager.getConnection(xx,xx,xx) 這個方法最終會調(diào)用 Service Provider 已經(jīng)加載的 Driver中可用的driver,調(diào)用driver的getConnection方法,對應(yīng)到Mysql的源碼,就是下方這個,重點是`com.mysql.jdbc.ConnectionImpl.getInstance` 
  2.  
  3. public java.sql.Connection connect(String url, Properties info) { 
  4.         if (url == null) { 
  5.             throw SQLError.createSQLException(Messages.getString("NonRegisteringDriver.1"), SQLError.SQL_STATE_UNABLE_TO_CONNECT_TO_DATASOURCE, null); 
  6.         } 
  7.         if (StringUtils.startsWithIgnoreCase(url, LOADBALANCE_URL_PREFIX)) { 
  8.             return connectLoadBalanced(url, info); 
  9.         } else if (StringUtils.startsWithIgnoreCase(url, REPLICATION_URL_PREFIX)) { 
  10.             return connectReplicationConnection(url, info); 
  11.         } 
  12.         Properties props = null
  13.         if ((props = parseURL(url, info)) == null) { 
  14.             return null; 
  15.         } 
  16.         if (!"1".equals(props.getProperty(NUM_HOSTS_PROPERTY_KEY))) { 
  17.             return connectFailover(url, info); 
  18.         } 
  19.         try { 
  20.             Connection newConn = com.mysql.jdbc.ConnectionImpl.getInstance(host(props), port(props), props, database(props), url); 
  21.             return newConn; 

再來看 getInstance具體做了啥?

  1. protected static Connection getInstance(String hostToConnectTo, int portToConnectTo, Properties info, String databaseToConnectTo, String url) 
  2.             throws SQLException { 
  3.         if (!Util.isJdbc4()) { 
  4.             return new ConnectionImpl(hostToConnectTo, portToConnectTo, info, databaseToConnectTo, url); 
  5.         } 
  6.         return (Connection) Util.handleNewInstance(JDBC_4_CONNECTION_CTOR, 
  7.                 new Object[] { hostToConnectTo, Integer.valueOf(portToConnectTo), info, databaseToConnectTo, url }, null); 
  8.     } 
  1. this.io = new MysqlIO(newHost, newPort, mergedProps, getSocketFactoryClassName(), getProxy(), getSocketTimeout(), 
  2.                 this.largeRowSizeThreshold.getValueAsInt()); 
  3. this.io.doHandshake(this.user, this.password, this.database); 

我們看,先通過MysqlIO創(chuàng)建了一個IO連接,然后進(jìn)行握手

  1. // save last exception to propagate to caller if connection fails 
  2.                 SocketException lastException = null
  3.                 // Need to loop through all possible addresses. Name lookup may return multiple addresses including IPv4 and IPv6 addresses. Some versions of 
  4.                 // MySQL don't listen on the IPv6 address so we try all addresses. 
  5.                 for (int i = 0; i < possibleAddresses.length; i++) { 
  6.                     try { 
  7.                         this.rawSocket = createSocket(props); // 這里創(chuàng)建了一個空的Socket對象 
  8.                         configureSocket(this.rawSocket, props); //將一些超時之類的屬性設(shè)置到socket中 
  9.                         InetSocketAddress sockAddr = new InetSocketAddress(possibleAddresses[i], this.port); //獲取host對應(yīng)的ip地址等,再加上端口,組成一個Address 
  10.                         // bind to the local port if not using the ephemeral port 
  11.                         if (localSockAddr != null) { 
  12.                             this.rawSocket.bind(localSockAddr); 
  13.                         } 
  14.                         this.rawSocket.connect(sockAddr, getRealTimeout(connectTimeout)); //實際連接到服務(wù)器 

連接Mysql的url中,可以分成好幾類,例如可以連接到mysql進(jìn)行l(wèi)oadbalanner, jdbc:mysql:loadbalancer//xxx 還有進(jìn)行replicated

我們在使用JDBC連接時,一定會常使用PreparedStatement, 這個稱為預(yù)編譯sql,其中可以設(shè)置一些占位符

那這些占位符是啥時候填充進(jìn)去的呢?

查看Mysql Connector 的源碼,我們發(fā)現(xiàn),實際前面的createPreparedStatment,setXX之類的時候,

只是設(shè)置到對應(yīng)的變量里記錄了下來,

在執(zhí)行executeQuery的時候,會再從前面記錄下來的變理中提取出來,做為值填充到原來的sql占位中去

整個sql做為一個packet發(fā)送過去。

這個時候也就更容易理解為啥預(yù)編譯不容易被SQL 注入,而拼接SQL容易。 因為預(yù)編譯在替換占位符時,即使你的值里有類似于 「--」 這一類的危險內(nèi)容,或者 1==1, 都是做為一個column的value 來使用,而拼接SQL,則會放到完整的語句中,在執(zhí)行時被全部解析,導(dǎo)致問題。

以下就是 MySQL Connector 在執(zhí)行 sql 時的調(diào)用棧。

 

  1. java.lang.Thread.State: RUNNABLE 
  2.   at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3633) 
  3.   at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2460) 
  4.   at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2625) 
  5.   at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2551) 
  6.   - locked <0x5a3> (a com.mysql.jdbc.JDBC4Connection) 
  7.   at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1861) 
  8.   at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1962) 

 

整個背后其實原理也和我們前面說的一樣,比較簡單,是通過一個TCP Socket 方式,在獲取到OutputStream,接裝好的SQL,

在執(zhí)行的時候,是寫到這個Output里,發(fā)送到 Mysql的服務(wù)器。

返回值是怎么獲取的呢? 是將返回的Buffer轉(zhuǎn)換成ResultSet

 

  1. ResultSetInternalMethods rs = readAllResults(callingStatement, maxRows, resultSetType, resultSetConcurrency, streamResults, catalog, resultPacket, 
  2.                   false, -1L, cachedMetadata); 

 

此外,在實際的業(yè)務(wù)開發(fā)中,對于在代碼中拿到的一個Connection,可能會遇到網(wǎng)絡(luò)抖動,數(shù)據(jù)庫服務(wù)異常等情況。有連接問題之前,我們可以先檢測連接是否可用,來避免繼續(xù)使用有問題的Connection,導(dǎo)致問題一直存在。

檢測一個連接是否可用,可以通過執(zhí)行一條最簡單的 `select 1` 來判斷是否有異常,當(dāng)然,在JDBC的標(biāo)準(zhǔn)里,也包含一個檢查連接是否可用的方法 isValid

實現(xiàn)原理,對于MySQL 的Connctor-J客戶端,是通過向Server發(fā)送一條ping的命令,來檢測連接的狀態(tài)。

總結(jié)一下,我們通過幾個部分來介紹了 MySQL Client 與 Server 的交互原理,以及JDBC 是什么,是通過什么方式來和 Server 進(jìn)行交互的。

順道再分享下最近遇到的一個和數(shù)據(jù)庫連接有關(guān)的小插曲。在處理一個問題,增加數(shù)據(jù)庫連接檢查之后,功能正確就上線了。上線不久,接到另一個服務(wù)提供方報警,說我們發(fā)送了其不能處理的數(shù)據(jù)庫指令。 黑人問號臉。我只是通過獲取數(shù)據(jù)庫狀態(tài)的一個getAttribute的方式來檢查下連接啊。 據(jù)說他們收到的是show xxx status之類的指令。 那為啥不能識別呢?

仔細(xì)問了一下,是由于他們提供的特殊 Proxy 服務(wù),只實現(xiàn)了MySQL 的部分指令解析,所以對應(yīng)show xxx 不支持,而我們項目里默認(rèn)以為全部的client 都支持全集指令,導(dǎo)致問題。之后改了一個檢查方式解決了報警問題。

所以,在開發(fā)時,也需要再考慮下接入的服務(wù),是否會按照規(guī)范,把全部內(nèi)容實現(xiàn)了。

【本文為51CTO專欄作者“侯樹成”的原創(chuàng)稿件,轉(zhuǎn)載請通過作者微信公眾號『Tomcat那些事兒』獲取授權(quán)】

戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2019-03-08 10:08:41

網(wǎng)絡(luò)程序猿代碼

2018-05-02 09:38:02

程序員代碼互聯(lián)網(wǎng)

2023-02-26 00:00:02

字符串分割String

2019-08-19 09:21:36

程序員Bug代碼

2018-06-27 14:23:38

機(jī)器學(xué)習(xí)人工智能入門方法

2021-01-27 18:13:35

日志nginx信息

2016-03-04 14:14:02

電話免費越洋

2017-12-26 15:41:26

2018-12-26 09:44:02

分布式緩存本地緩存

2024-01-04 12:33:17

ChatGPTAI視頻

2022-03-21 08:55:53

RocketMQ客戶端過濾機(jī)制

2012-12-28 13:47:36

Raspberry PGeek

2017-02-09 17:00:00

iOSSwiftKVC

2022-01-05 17:13:28

監(jiān)控HTTPS網(wǎng)站

2021-11-29 05:37:24

Windows Def操作系統(tǒng)微軟

2020-08-14 08:19:25

Shell命令行數(shù)據(jù)

2009-04-28 07:48:29

蓋茨打工基金會

2018-07-10 09:07:57

AI數(shù)據(jù)科技

2020-12-31 06:12:38

Siri Windows電腦

2022-11-02 07:46:31

GoFrameGcache緩存
點贊
收藏

51CTO技術(shù)棧公眾號

欧美国产1区2区| 亚洲一区二区三区四区五区午夜| 欧美日韩视频第一区| 亚洲.欧美.日本.国产综合在线| 国产精品国产精品国产专区| 伊人影院久久| 在线观看精品国产视频| 日本少妇激三级做爰在线| 欧亚在线中文字幕免费| 国产精品青草综合久久久久99| 成人综合电影| 黄色av网站免费| 亚洲视频一区| 中文字幕日韩av| 亚洲激情 欧美| 99re8精品视频在线观看| 精品久久久久久| 亚洲最新免费视频| 黄瓜视频免费观看在线观看www | 日韩区欧美区| 欧美日韩一区二区三区| 裸体裸乳免费看| 久久电影视频| 国产成人8x视频一区二区| 国产精品99免视看9| 国产无码精品一区二区| 国产精品久久占久久| 亚洲视频在线免费看| fc2成人免费视频| 青草伊人久久| 欧美人妇做爰xxxⅹ性高电影 | 欧美极品色图| 成人午夜精品福利免费| 麻豆精品一区二区三区| 日韩美女免费线视频| 欧美亚韩一区二区三区| 欧美阿v一级看视频| 日韩有码在线电影| 国产调教在线观看| 久久91精品| 国产视频精品免费播放| 国产视频久久久久久| 2020国产精品极品色在线观看| 欧美日韩国产综合久久| 中文字幕天天干| 欧美日韩成人影院| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 午夜精品久久久久久久爽| 激情综合色综合久久| 国产精品丝袜久久久久久高清| www.久久精品视频| 亚洲欧美日韩国产| 欧美综合一区第一页| 好吊妞视频一区二区三区| 日韩视频一区二区三区在线播放免费观看| 欧美国产日韩二区| 国产福利久久久| 亚洲精品偷拍| 欧美中文在线免费| www.欧美色| 日韩国产一区二| 国产精品一区二区女厕厕| 中文字幕第31页| 精品亚洲成a人| 1区1区3区4区产品乱码芒果精品| 99久久精品免费看国产交换| 国产福利精品一区| 国产精品传媒毛片三区| 四虎免费在线观看| 久久综合狠狠综合| 四虎永久在线精品免费一区二区| avtt在线播放| 亚洲精品视频在线观看免费| 免费看欧美一级片| 免费在线小视频| 色www精品视频在线观看| 色婷婷狠狠18| 欧美高清一级片| 亚洲精品福利免费在线观看| 中文字幕在线1| 91精品一区二区三区综合| 欧美精品日韩三级| av资源免费观看| 免费xxxx性欧美18vr| 亚洲精品日产aⅴ| 四虎精品一区二区三区| 日本一区二区成人在线| 警花观音坐莲激情销魂小说| 国产精品yjizz视频网| 色狠狠色狠狠综合| 日本中文字幕在线不卡| 日韩成人动漫在线观看| 中文字幕综合在线| 久久9999久久免费精品国产| 丝袜美腿成人在线| 99www免费人成精品| 久久精品a一级国产免视看成人| 亚洲国产精品高清| 又大又硬又爽免费视频| 国产成人福利夜色影视| 日韩免费电影一区| 日韩毛片无码永久免费看| 亚洲欧美综合久久久| 午夜剧场成人观在线视频免费观看| 国产一级片av| a在线播放不卡| 亚洲国产一区二区三区在线 | 国内精品久久久久久久影视简单 | 欧美高清一区二区| gogogogo高清视频在线| 色综合天天综合在线视频| 欧美又黄又嫩大片a级| 亚洲深夜福利在线观看| 欧美人在线观看| 亚洲天堂狠狠干| 91在线一区二区| 欧美少妇在线观看| 亚洲伦理影院| 欧美r级在线观看| 日韩精品一区二区三区在线视频| 国产精品免费看| 国产精品污www一区二区三区| 中文字幕在线视频区| 狠狠躁天天躁日日躁欧美| 黄色一级片免费播放| 精品一二三区| 日本aⅴ大伊香蕉精品视频| 丰满少妇在线观看bd| 亚洲免费视频中文字幕| 在线观看岛国av| 久久中文字幕二区| 国产精品黄色影片导航在线观看| 色av男人的天堂免费在线| 亚洲一区二区综合| 女人扒开腿免费视频app| 91精品综合久久久久久久久久久| 日韩av高清不卡| 日韩精品福利| 欧美日韩日本国产| 日批视频免费看| 欧美福利一区| 91成人理论电影| 粗大黑人巨茎大战欧美成人| 69堂精品视频| 在线观看亚洲网站| 久久99精品国产.久久久久久| 午夜精品视频在线观看一区二区| 日产精品一区| 中文字幕亚洲专区| 国产成人精品一区二区色戒| 中文字幕乱码一区二区免费| 我要看一级黄色大片| 欧美精品一区二区三区中文字幕| 国产不卡av在线免费观看| 青青草视频在线观看| 欧美性猛交xxxx富婆弯腰| 精品人妻少妇嫩草av无码| 香蕉av777xxx色综合一区| 女人一区二区三区| 亚洲电影有码| 日韩一中文字幕| 午夜精品久久久久久久99热黄桃| 亚洲午夜影视影院在线观看| 国产草草浮力影院| 亚洲一区二区三区免费在线观看 | 男人的天堂av高清在线| 在线亚洲高清视频| 亚洲欧美日韩第一页| 极品少妇xxxx偷拍精品少妇| 国产91在线亚洲| 久久超级碰碰| 国产成人精品久久久| 日本免费在线视频| 91精品午夜视频| 澳门黄色一级片| 成人aaaa免费全部观看| 99热成人精品热久久66| 人人狠狠综合久久亚洲婷| 91久久久精品| 精品众筹模特私拍视频| 精品无人区乱码1区2区3区在线| 一级黄色在线观看| 日韩毛片在线免费观看| 男人网站在线观看| 日本不卡一二三区黄网| 色爽爽爽爽爽爽爽爽| 精品欧美午夜寂寞影院| 国产精品美女久久| 肉体视频在线| 亚洲色图17p| 国产黄色高清视频| 色综合激情久久| 极品盗摄国产盗摄合集| 91视频免费播放| 99九九精品视频| 午夜一区不卡| 肉大捧一出免费观看网站在线播放| 秋霞蜜臀av久久电影网免费 | 91精品久久久久久综合五月天| 国产成人97精品免费看片| 在线三级中文| 一区二区三区国产视频| 欧美少妇bbw| 欧美日韩国产一区二区三区地区| 日韩特黄一级片| 最新中文字幕一区二区三区 | 亚洲免费专区| 114国产精品久久免费观看| 最新欧美电影| 国内精品免费午夜毛片| 91xxx在线观看| 亚洲另类xxxx| 国模人体一区二区| 欧美高清一级片在线| av一级在线观看| 污片在线观看一区二区| 亚洲成人生活片| 国产精品视频你懂的| www.色天使| 成人中文字幕合集| 午夜精品免费看| 奇米一区二区三区| 欧美日韩在线不卡视频| 激情自拍一区| 97av中文字幕| 亚洲一级毛片| 中文字幕日韩精品一区二区| 国产videos久久| 久久久精品国产一区二区三区| 北条麻妃一区二区三区在线观看| 欧美色精品在线视频| 国产伦视频一区二区三区| 在线观看欧美| 国产精品第二页| 345成人影院| 91超碰caoporn97人人| 97影院秋霞午夜在线观看| 日韩在线精品一区| 成全电影播放在线观看国语| 亚洲人成网7777777国产| 色中色在线视频| 亚洲精品国产suv| 国精产品一品二品国精品69xx| 日韩精品最新网址| www.蜜桃av.com| 日韩欧美一级二级| 99国产在线播放| 日韩三级精品电影久久久| 国产剧情久久久| 日韩一区二区电影网| 国产成a人亚洲精v品无码| 日韩欧美在线网站| 精品国产99久久久久久宅男i| 91精品国产一区二区人妖| 国产女主播福利| 日韩精品综合一本久道在线视频| a毛片在线免费观看| 91麻豆精品国产91久久久久久久久 | 中国女人特级毛片| 国产丝袜美腿一区二区三区| 欧美做受高潮6| 中文字幕日韩一区| xxxx日本少妇| 亚洲mv在线观看| 精品欧美一区二区三区免费观看| 日韩欧美精品在线观看| 久久久久亚洲视频| 欧美二区三区的天堂| 亚洲高清视频网站| 亚洲美女久久久| 1769在线观看| 欧美精品videos| 免费福利视频一区二区三区| 国产美女高潮久久白浆| 欧美一区一区| 久久精品五月婷婷| 四虎成人av| 国产av熟女一区二区三区| 国产精品久久国产愉拍| 久久综合伊人77777麻豆最新章节| 久久国产人妖系列| 国产一级免费片| 久久精品无码一区二区三区| 国产精品国产三级国产传播| 亚洲国产综合色| 日韩久久久久久久久久| 日韩欧美电影一区| 激情小视频在线| 久久国产精品影视| 原纱央莉成人av片| 成人免费网视频| 色哟哟精品丝袜一区二区| 亚洲精品一区国产精品| 亚洲视频一二| 午夜剧场在线免费观看| 91一区二区三区在线观看| 美女福利视频网| 天天射综合影视| 97精品人妻一区二区三区在线 | 成人全视频高清免费观看| 美女福利精品视频| 久久精品女人天堂av免费观看 | 韩国三级在线观看久| 久久91精品国产91久久久| 日韩欧美看国产| 成人片在线免费看| 91嫩草亚洲精品| 日韩av资源在线| 成人免费福利片| 波多野结衣在线网址| 色屁屁一区二区| 日本高清视频免费看| 久久亚洲影音av资源网| gogo亚洲高清大胆美女人体| 高清视频在线观看一区| 天天天综合网| the porn av| 91看片淫黄大片一级在线观看| 538任你躁在线精品视频网站| 色妹子一区二区| 天天干视频在线| 欧美黄色免费网站| 国产一区精品二区| 亚洲春色在线视频| 天堂一区二区在线| 欧美 日本 国产| 亚洲国产成人porn| 国产suv一区二区| 久久久精品一区二区三区| 成人久久网站| 日韩wuma| 日韩av中文字幕一区二区| 给我看免费高清在线观看| 香港成人在线视频| 亚洲男人天堂久久| 欧美国产精品日韩| jizz久久精品永久免费| 热久久最新网址| 国产毛片精品视频| 婷婷激情四射网| 欧美精品乱码久久久久久| 欧美一级二级三级区| 国产精品一区久久久| 日韩精品网站| 精品日韩久久久| 国产精品入口麻豆原神| 中文字幕一区二区三区四区免费看| 亚洲视频axxx| 97精品国产综合久久久动漫日韩 | 欧美日韩一本到| 91社区在线| 成人h猎奇视频网站| 精品高清久久| 亚洲欧美国产日韩综合| 中文字幕日韩精品一区| 国产精品视频一二区| 久久精品久久精品亚洲人| 精品一区二区三区四区五区 | 久久只有精品| 天天操天天干天天操天天干| 精品视频免费看| av片哪里在线观看| 成人欧美一区二区三区视频 | 国产精品自产拍在线观看| 欧美国产一级| 伦伦影院午夜理论片| 亚洲成人午夜影院| 黄色在线网站| 成人黄色av网站| 狠狠综合久久| 久久国产精品影院| 欧美三日本三级三级在线播放| 看黄网站在线| 国产高清精品一区二区| 亚洲欧美日韩国产| 992在线观看| 亚洲精品一区二区精华| 成人做爰视频www网站小优视频| 一区二区三区国| 成人av网址在线观看| 精产国品一区二区| 不卡av电影院| 天堂av一区二区三区在线播放| 男女视频在线看| 一区二区三区成人在线视频| 日本电影一区二区在线观看| 国产日韩在线看片| 激情婷婷亚洲| 国产黄色片在线| 亚洲国内精品在线| 久久亚洲人体| 欧美 丝袜 自拍 制服 另类| 国产精品全国免费观看高清| 熟妇人妻中文av无码| 国产色综合天天综合网| 99综合在线| 午夜成人亚洲理伦片在线观看| 亚洲精品成人av| 91精品亚洲一区在线观看| 国产视频一视频二|