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

一個SQL錯誤的問題讓我找到了公司框架中三個Bug

數(shù)據(jù)庫 SQL Server
本文是對之前開發(fā)中遇到的問題的一個總結(jié),文章其實早就寫好,但是覺得自己寫得不夠深入,就讓文章一直躺在草稿箱里。昨天突然想起來了,就將文章重新修改了一下,還是發(fā)出來吧!

本文是對之前開發(fā)中遇到的問題的一個總結(jié),文章其實早就寫好,但是覺得自己寫得不夠深入,就讓文章一直躺在草稿箱里。昨天突然想起來了,就將文章重新修改了一下,還是發(fā)出來吧!

[[389221]]

問題1

當(dāng)時我在開發(fā)一個異常日志記錄接口,其實業(yè)務(wù)流程很簡單,就是前端提交錯誤日志到后臺,后臺接受到信息處理一番,然后插入數(shù)據(jù)庫。因為這個接口的并發(fā)量比較高,為了不影響其他業(yè)務(wù),并且同時提高響應(yīng)的速度。于是采用 @Async 注解+ Spring線程池的方案來實現(xiàn)。線程池的配置如下:

  1. <task:annotation-driven executor="jobExecutor"/>   
  2. <task:executor id="jobExecutor" pool-size="20" queue-capacity="500" />   

使用 task:annotation-driven/ 開啟異步時,一定要記得配置executor屬性,不然異步使用的線程池其實是

org.springframework.core.task.SimpleAsyncTaskExecutor ,但這個 SimpleAsyncTaskExecutor 不是真的線程池,這個類不重用線程,每次調(diào)用都會創(chuàng)建一個新的線程。

關(guān)鍵部分偽代碼如下:

  1. @Async  
  2.  public void test(){  
  3.   
  4.      ExceptionLogEntity exceptionLogEntity = new ExceptionLogEntity();  
  5.      exceptionLogEntity.setXX("");  
  6.      exceptionLogEntity.setXXX("");  
  7.      exceptionLogEntity.setIp("");  
  8.      exceptionLogEntity.setUrl("");  
  9.      exceptionLogEntity.setBusinessScene("");  
  10.      exceptionLogEntity.setExceptionType("");  
  11.      exceptionLogEntity.setExceptionDetailType("");  
  12.      exceptionLogEntity.setExceptionMessage("");  
  13.      exceptionLogEntity.setNoticeStatus("");  
  14.      exceptionLogEntity.setCreateTime(new Date());  
  15.      exceptionLogEntity.setUpdateTime(new Date());  
  16.   
  17.   
  18.      ExceptionLogEntity insert = exceptionLogDao.insert(exceptionLogEntity);  
  19.      log.info("實體的主鍵id=[{}]"insert.getId());  
  20.   
  21.  }  

代碼寫完我簡單的測試了一下,沒啥問題后就告知前端可以對接了。可是奇怪的事情發(fā)生了,前端老鐵告訴我接口有時會返回錯誤。我一聽就感覺不對勁,心想這么簡單的接口,我怎么可能有bug。于是我到日志平臺上查詢了一下日志,結(jié)果還真的是有問題。發(fā)現(xiàn)了一個SQL錯誤,具體錯誤如下(敏感信息已經(jīng)處理):

  1. Caused by: java.lang.reflect.InvocationTargetException  
  2.   
  3. INSERT INTO `xx`(`xx`,`xx`,`ip`,`url`,`business_scene`,`exception_type`,`exception_detail_type`,`exception_message`,`notice_status`,`create_time`,`update_time`,`xx`,`member_phone`,`ip`,`url`,`business_scene`,`exception_type`,`exception_detail_type`,`exception_message`,`notice_status`,`create_time`,`update_time`) VALUES('','','','','','','','','','2020-01-08 19  
  4.   
  5. at sun.reflect.GeneratedMethodAccessor115.invoke(Unknown Source)  
  6.   
  7. --------------------------------------------  
  8.   
  9. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)  
  10.   
  11. at java.lang.reflect.Method.invoke(Method.java:498)  
  12.   
  13. at coderead.mybatis.log.JdbcCommonCollects$PreparedStatementHandler.invoke(JdbcCommonCollects.java:118)  
  14.   
  15. ... 21 more  
  16.   
  17. Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Column 'update_time' specified twice  
  18.   
  19. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)  
  20.   
  21. at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)  
  22.   
  23. at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)  
  24.   
  25. at java.lang.reflect.Constructor.newInstance(Constructor.java:423)  
  26.   
  27. at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)   
[[389222]]

復(fù)現(xiàn)問題

這個問題簡單的來說就是SQL中的字段發(fā)生了重復(fù), Column 'update_time' specified twice。其實不止update_time字段發(fā)生了重復(fù),是很多字段都發(fā)生了重復(fù)。因為這個接口除了并發(fā)高一點之外,和其他的接口沒有什么特別之處!突然我腦子里靈光一閃,難道是這個接口并發(fā)較高,導(dǎo)致框架在生成INSERT類型的SQL發(fā)生了錯誤???要是這樣的話,我直接創(chuàng)造一個這樣的場景不就可以實現(xiàn)了嘛!然后我寫下了下面的代碼:

  1. public void test(){  
  2.   
  3.         for (int i = 0; i < 1000; i++) {  
  4.             ExceptionLogEntity exceptionLogEntity = new ExceptionLogEntity();  
  5.             exceptionLogEntity.setXX("");  
  6.             exceptionLogEntity.setXXX("");  
  7.             exceptionLogEntity.setIp("");  
  8.             exceptionLogEntity.setUrl("");  
  9.             exceptionLogEntity.setBusinessScene("");  
  10.             exceptionLogEntity.setExceptionType("");  
  11.             exceptionLogEntity.setExceptionDetailType("");  
  12.             exceptionLogEntity.setExceptionMessage("");  
  13.             exceptionLogEntity.setNoticeStatus("");  
  14.             exceptionLogEntity.setCreateTime(new Date());  
  15.             exceptionLogEntity.setUpdateTime(new Date());  
  16.   
  17.             Thread thread = new Thread(() -> {  
  18.                 exceptionLogDao.insert(exceptionLogEntity);  
  19.             });  
  20.   
  21.             thread.start();  
  22.         }  
  23.     }  

代碼寫完直接重啟項目,最后一觸發(fā)上面的代碼。果然,同樣的錯誤又出現(xiàn)了。這里我先介紹下使用的ORM框架:

此ORM框架是集團(tuán)O2O研發(fā)中心研發(fā)的基礎(chǔ)組件,提供同Mybatis一樣的功能:只需定義接口,無需寫實現(xiàn)類。此外,對單表操作還封裝了一套常用的增刪改查處理,連接口也無需再定義,對開發(fā)人員非常友好,大大降低了冗長的jdbc操作代碼量,提升了開發(fā)效率。

我問了問旁邊的同事,在使用公司的ORM框架自帶的INSERT方法時,有沒有遇到SQL列重復(fù)的問題嗎?嘿你還別說,大家異口同聲說遇到過。那厲害了,看來這真的不是個別現(xiàn)象,真的是框架的bug。于是乎我花了一點時間來找找看到底是在哪個地方出現(xiàn)了問題,皇天不負(fù)有心人我還真的找到了,具體的代碼如下:

  1. public List<DalColumn> getDalColumnsWithoutId() {  
  2.     if (this.columnsWithoutId != null) {  
  3.         return this.columnsWithoutId;  
  4.     } else {  
  5.         this.columnsWithoutId = new ArrayList(this.dalColumns.size() - 1);  
  6.         Iterator var1 = this.dalColumns.iterator();  
  7.   
  8.         while(var1.hasNext()) {  
  9.             DalColumn column = (DalColumn)var1.next();  
  10.             if (!column.isIdColumn()) {  
  11.                 this.columnsWithoutId.add(column);  
  12.             }  
  13.         }  
  14.   
  15.         return this.columnsWithoutId;  
  16.     }  
  17. }  

問題就出在 columnsWithoutId 上,它的類型是 List ,是所在類的一個屬性默認(rèn)為null,保存的是一個表除主鍵ID之外的所有字段。上面的代碼在單線程情況下沒有問題,但是在多線程的情況下就問題大了。 columnsWithoutId 在多線程情況下就是一個 線程共享變量 ,假設(shè)在某個時機(jī)有多個線程恰好執(zhí)行到 if 代碼塊,發(fā)現(xiàn) columnsWithoutId 的值為null,則就會同時執(zhí)行 else代碼塊,那這時就會執(zhí)行多次循環(huán),自然 columnsWithoutId 中的字段就會出現(xiàn)了重復(fù)。

解決問題

這個問題已經(jīng)找到,那接下來就差一個解決方案了。

官方修復(fù)

我當(dāng)時想既然這個框架是公司研發(fā)中心提供的基礎(chǔ)組件,那就是說明在公司內(nèi)部會有很多項目組使用,問題說不定早就被修復(fù)了。你還別說在公司的wiki上我還真的找到了,有位負(fù)責(zé)這個組件的大佬在wiki上分享了”單表插入偶發(fā)列重復(fù)問題定位與解決”的文章。(文章地址我就不發(fā)了,公司內(nèi)部地址發(fā)出來你們也訪問不了)文章里詳細(xì)的描述了問題發(fā)生的場景(和我上面描述的差不多)、問題定位過程還有解決方案。摘選文章上的解決方案:

明確了是線程安全的問題,解決方案就好確定了,解決線程安全有三種方案:

方案一:互斥同步——synchronized,ReentrantLock

方案二:非阻塞同步——CAS

方案三:無同步方案:——ThreadLocal

結(jié)合業(yè)務(wù)場景,綜合分析,最終確認(rèn)使用方案一,采用synchronized關(guān)鍵字,使用雙重檢查鎖的方式解決此問題。

大佬已經(jīng)將bug修復(fù)并發(fā)布了新版本到Maven倉庫,項目中有發(fā)生上述問題的,直接升級對應(yīng)的組件版本即可。既然官方已經(jīng)給出了解決方案,我直接升級項目中的組件版本號就行了。結(jié)果我一更換項目中的版本,我的項目就再也沒有啟動起來。研究發(fā)現(xiàn),組件版本相差太多,很多依賴發(fā)生了沖突。我項目中使用的是 1.1.6-RELEASE ,問題官方在版本 2.1.0-RELEASE 中修復(fù)。這組件版本差距太大貿(mào)然升級肯定是有很大的風(fēng)險了,于是我放棄了!

另辟蹊徑解決

既然你自帶的插入方法有問題,我直接自定義一個插入方法不就得了。惹不起我還躲不起么!我最后又問了同事們最后都是怎么解決的,大家也都說是自定義SQL,而且都不再用框架自帶的方法了,大家都很聰明呀!(其實這個還有后續(xù),后面有一期開發(fā)過程中,需要用到批量插入的功能,我又偷懶用了框架自帶的batch方法,又把我給坑了。從那之后,我再也沒有用自帶的方法了……)

問題2

我在排查上面的問題的時候,在框架里面看到了下面的代碼:

  1. private Number execute4PrimaryKey(String sqlId, Map<String, Object> paramMap, KeyHolder keyHolder) {  
  2.     long startTimestamp = System.currentTimeMillis();  
  3.     String sql = null;  
  4.   
  5.     Object var8;  
  6.     try {  
  7.         MappedStatement mappedStatement = this.configuration.getMappedStatement(sqlId, true);  
  8.         mappedStmtThreadLocal.set(mappedStatement);  
  9.         sql = mappedStatement.getBoundSql(paramMap);  
  10.         int result = false;  
  11.         int result;  
  12.         if (keyHolder != null) {  
  13.             this.execution.update(sql, new MapSqlParameterSource(DalUtils.mapIfNull(paramMap)), keyHolder);  
  14.             result = keyHolder.getKey() == null ? 0 : keyHolder.getKey().intValue();  
  15.         } else {  
  16.             result = this.execution.update(sql, DalUtils.mapIfNull(paramMap));  
  17.         }  
  18.   
  19.         Integer var9 = result;  
  20.         return var9;  
  21.     } catch (Exception var13) {  
  22.         this.throwException(var13);  
  23.         var8 = null;  
  24.     } finally {  
  25.         mappedStmtThreadLocal.remove();  
  26.         logger.debug("{} method:{}, sql:{}, param:{}", new Object[]{this.logPrefix, "execute", sql, paramMap});  
  27.         this.logProfileLongTimeRunningSql(startTimestamp, sql, paramMap);  
  28.     }  
  29.   
  30.     return (Number)var8;  
  31. }  

大家仔細(xì)看看,這上面的代碼有個不容易發(fā)現(xiàn)的問題。問題是這樣的,我們系統(tǒng)中表的主鍵類型定義的都是 bigint ,這個類型對應(yīng)的是Java中的 Long 類型,說到這大家明白了么?對了,就是數(shù)據(jù)溢出的問題。

復(fù)現(xiàn)問題

我將表中的主鍵自增量設(shè)置為Java Int類型的最大值+1,也就是2147483648。然后數(shù)據(jù)庫再新增一條記錄,此時表中記錄的主鍵是2147483648,但Java實體中的主鍵ID已經(jīng)是個負(fù)數(shù)-2147483648了。

一個SQL錯誤的問題讓我找到了公司框架中三個bug

使用Long類型時,要注意JavaScript接收后端Long類型數(shù)據(jù)精度丟失問題

解決問題

這個問題還真不好另辟蹊徑了,只能后面出現(xiàn)類似的問題,升級ORM框架的版本了。

問題3

其實這個問題我應(yīng)該在看那篇內(nèi)部文章的時候就應(yīng)該發(fā)現(xiàn)的,但我當(dāng)時就是沒有看出來!此時的我留下了沒有技術(shù)的淚水。對于問題1,當(dāng)時那位大佬最終采用 synchronized 進(jìn)行加鎖解決多線程情況下共享變量讀寫問題,具體代碼如下(敏感信息打碼):

修改前的代碼:

  1. public List<DalColumn> getDalColumnsWithoutId() {  
  2.         if (this.columnsWithoutId != null) {  
  3.             return this.columnsWithoutId;  
  4.         } else {  
  5.             this.columnsWithoutId = new ArrayList(this.dalColumns.size() - 1);  
  6.             Iterator var1 = this.dalColumns.iterator();  
  7.   
  8.             while(var1.hasNext()) {  
  9.                 DalColumn column = (DalColumn)var1.next();  
  10.                 if (!column.isIdColumn()) {  
  11.                     this.columnsWithoutId.add(column);  
  12.                 }  
  13.             }  
  14.   
  15.             return this.columnsWithoutId;  
  16.         }  
  17.     }  

修改后的代碼(引用文章中的代碼截圖):

一個SQL錯誤的問題讓我找到了公司框架中三個bug

問題復(fù)現(xiàn)

這個問題要復(fù)現(xiàn)的話,不太好復(fù)現(xiàn),因為情況是比較極端的,但是在復(fù)雜的生產(chǎn)環(huán)境還是很可能出現(xiàn)的。

舉例說明:

假設(shè)有A、B兩個線程,A線程執(zhí)行到for循環(huán)處,B線程恰好執(zhí)行到最開始的if判斷處,由于此時的cloumnsWithId已經(jīng)被A線程賦值,肯定不為null,然后線程B就直接返回了,導(dǎo)致B線程調(diào)用者獲得了一個空的或者保存部分字段的cloumnsWithId。這種情況最終導(dǎo)致的結(jié)果是INSERT SQL中的字段缺失。

解決辦法

對于多線程下的共享變量,我們一定要堅持 讀讀可并行,讀寫要排隊 的原則。當(dāng)然能不加鎖的話,也是不錯的選擇。

我發(fā)現(xiàn)這個問題之后,就找到了前文中說的大佬,跟他反饋了我的想法,并提出我的解決方案。

  1. 直接在 getDalColumnsWithoutId 方法上添加 synchronized 。
  2. 修改第一個if判斷邏輯,然后使用 synchronized 鎖代碼塊。
  1. public List<DalColumn> getDalColumnsWithoutId() {  
  2.     int size = CollectionUtils.size(this.dalColumns);  
  3.     if (CollectionUtils.size(this.columnsWithoutId) == size && size > 0 ) {  
  4.         return this.columnsWithoutId;  
  5.     }  
  6.     synchronized(lock){  
  7.         if (columnsWithoutId == null) {  
  8.             columnsWithoutId = new ArrayList<>(size*2);  
  9.         }  
  10.         for (DalColumn column :  this.dalColumns){  
  11.             if (!column.isIdColumn()) {  
  12.                 this.columnsWithoutId.add(column);  
  13.             }  
  14.         }  
  15.     }  
  16.     return this.columnsWithoutId;  
  17. }  

當(dāng)時與大佬的溝通截圖,來自大佬的肯定:

一個SQL錯誤的問題讓我找到了公司框架中三個bug

總結(jié)

在遇到問題的時候不要著急,一定要學(xué)會大膽假設(shè),然后小心求證。要勇敢地質(zhì)疑權(quán)威,不要認(rèn)為既然已經(jīng)是框架了就沒有bug。例如Spring從當(dāng)初的1.0到現(xiàn)在版本號都超過5.0了,除了給Spring增加新的功能,其他的升級就是在修復(fù)Spring中的bug。做出自己的假設(shè)之后,就要進(jìn)行場景復(fù)現(xiàn),一個正常的bug是可以不斷地被復(fù)現(xiàn)的。復(fù)現(xiàn)了問題那就是找到問題的癥結(jié)所在,剩下的就是如何去解決啦!

 

責(zé)任編輯:華軒 來源: 今日頭條
相關(guān)推薦

2022-09-20 10:41:32

接口優(yōu)化網(wǎng)絡(luò)

2016-12-14 10:00:44

數(shù)據(jù)結(jié)構(gòu)編譯器

2010-04-19 09:31:44

KDE

2021-06-03 10:34:43

GitHub停車系統(tǒng)項目

2020-09-29 07:44:20

跨域前后端分離插件

2022-11-30 09:18:51

JavaMyBatisMQ

2021-04-22 07:47:47

JavaJDKMYSQL

2011-05-23 13:05:25

重載重寫隱藏

2022-01-07 10:24:58

裁員經(jīng)營管理互聯(lián)網(wǎng)

2022-05-16 08:42:26

Pandasbug

2022-05-31 08:35:05

RocketMQACK客戶端

2022-05-16 08:43:33

CIOIT咨詢

2013-06-18 11:37:42

XFSRHEL 6.4

2010-03-24 10:32:05

Python多線程

2022-04-06 08:47:03

Dubbo服務(wù)協(xié)議

2025-03-25 10:35:37

OraclePython數(shù)據(jù)庫

2015-07-03 11:16:14

編程一個手鐲

2021-09-13 08:41:52

職場互聯(lián)網(wǎng)自閉

2021-02-02 05:41:16

底層設(shè)計頂層

2020-07-03 07:56:34

Golang編程語言
點贊
收藏

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

久久成人久久爱| 国模私拍一区二区国模曼安| 丝袜a∨在线一区二区三区不卡| 亚洲精品电影网站| 国产无限制自拍| 高h视频在线播放| 国产主播福利在线| 亚洲免费网站| 亚洲国产精品成人精品| 国产美女主播在线播放 | 超碰人人人人人人人| 免费欧美电影| 欧美激情中文字幕一区二区| 国产精品久久久久久久久借妻 | 国产日韩亚洲精品| 日韩免费不卡视频| 亚洲天堂av资源在线观看| 亚洲精品国产无套在线观| 国产精品制服诱惑| 色中文字幕在线观看| 五月天中文字幕| 日韩欧美一区二区三区在线视频| 欧美乱熟臀69xxxxxx| 91大学生片黄在线观看| 天天干视频在线| 视频一区在线播放| 色妞欧美日韩在线| 成年人看片网站| 亚洲优女在线| 国产精品久久久久四虎| www.久久久| 美国黄色小视频| 国产乱人伦丫前精品视频| 欧美性xxxx极品hd满灌| 中文字幕日韩一区二区三区| 男人天堂一区二区| 丝袜亚洲精品中文字幕一区| 精品国内自产拍在线观看| 成年女人免费视频| 成人综合网站| 亚洲成人自拍一区| 亚洲精品免费在线看| 亚洲第一第二区| 老色鬼久久亚洲一区二区| 久久综合色88| 最近中文字幕免费视频| 欧美一级大片在线视频| 精品久久久精品| 一区二区三区视频| 色播色播色播色播色播在线| 国产一区二区三区香蕉| 欧美最顶级的aⅴ艳星| 欧美丰满熟妇bbbbbb| 在线成人动漫av| 欧美一区二区三区免费在线看| 能在线观看的av| 美女av在线播放| 久久综合色播五月| av成人观看| 中文字幕在线观看高清| 亚洲综合不卡| 欧美国产日韩一区二区在线观看 | 在线免费观看高清视频| 国产情侣久久| 欧美人与物videos| 国产传媒视频在线 | 99视频免费观看| av首页在线观看| 亚洲茄子视频| 久久久www成人免费精品张筱雨| v8888av| 精品国产一区二区三区性色av| 在线观看日产精品| 国产免费黄色小视频| 91最新在线视频| 国产精品美女久久久久久久| 欧美精品七区| 欧美特黄一级视频| 国产黄色91视频| 成人在线中文字幕| 中文字幕欧美在线观看| 日日夜夜精品视频免费| 国产91在线播放| 一级片中文字幕| 激情成人综合| 欧美精品成人91久久久久久久| 欧美精品入口蜜桃| 欧美在线免费一级片| 萌白酱国产一区二区| 三上悠亚作品在线观看| 欧美超碰在线| 色七七影院综合| 美女100%露胸无遮挡| 精品不卡一区| 国产一区二区三区在线视频 | 天天干天天操天天拍| 精品亚洲成人| 国产亚洲精品久久久久动| 新91视频在线观看| 欧美熟乱15p| 国产亚洲精品久久久| 国产精品情侣呻吟对白视频| 亚洲国产欧美日韩在线观看第一区 | 欧美一个色资源| 国产又粗又长又爽又黄的视频| 99久久久国产| 在线观看91精品国产麻豆| 小早川怜子一区二区三区| 精品精品视频| 亚洲国产第一页| 成人一区二区三区仙踪林| 欧美变态网站| 一本大道久久加勒比香蕉| 亚洲综合图片一区| 中文字幕亚洲综合久久五月天色无吗''| 久久深夜福利免费观看| 精品无码免费视频| 免费在线观看成人av| 国产成人拍精品视频午夜网站| 中文字幕乱码人妻二区三区| 国产乱人伦精品一区二区在线观看| 99高清视频有精品视频| 全色精品综合影院| 亚洲视频在线一区| 中国丰满熟妇xxxx性| 日本久久免费| 欧美一级黄色录像| 爱爱的免费视频| 97国产精品| 欧美激情视频网址| 黄色大全在线观看| 粉嫩嫩av羞羞动漫久久久| 欧美日产一区二区三区在线观看| 黄网页免费在线观看| 福利精品视频在线| 欧美日韩精品区别| 欧美亚洲大陆| 久久综合伊人77777尤物| 天天综合网入口| 另类欧美日韩国产在线| 国产日韩精品久久| 黄色片免费在线| 亚洲精品视频免费看| 欧美牲交a欧美牲交aⅴ免费真| 精品视频一区二区三区在线观看| 亚洲福利在线看| 少妇无套高潮一二三区| 国产精品黄色| 91精品美女在线| 手机看片福利在线观看| 综合在线观看色| 人妻少妇精品久久| 婷婷久久免费视频| 亚洲欧美在线看| 国产性70yerg老太| 日本不卡视频在线观看| 精品国产一区二区三区免费 | 日韩精品视频网| 国产视频一区二区三区四区| 米奇精品一区二区三区| 欧美中文字幕不卡| 丰满少妇在线观看资源站| 精品91在线| 91亚洲精品一区| 美州a亚洲一视本频v色道| 亚洲一区在线看| 亚洲成人手机在线观看| 色综合狠狠操| 国产成+人+综合+亚洲欧洲| 婷婷丁香花五月天| 一级特黄大欧美久久久| 午夜激情视频网| 午夜精品毛片| 成人在线播放av| 免费在线观看av片| 色综合久久综合网97色综合| 最近中文字幕无免费| 伊人激情综合| 成人欧美一区二区三区在线观看| 国产网友自拍视频导航网站在线观看| 欧美在线观看视频一区二区三区| 人妻一区二区视频| 葵司免费一区二区三区四区五区| 蜜桃久久精品乱码一区二区 | 国产精品欧美一级免费| 黄色一级视频在线播放| 国产主播性色av福利精品一区| 欧美精品18videosex性欧美| 国产乱人乱偷精品视频| 亚洲人成精品久久久久| 一级黄色片在线免费观看| 性农村xxxxx小树林| 精品一二三区| 国产经典一区二区| 91看片在线观看| 欧美日韩另类国产亚洲欧美一级| 精品手机在线视频| 麻豆精品在线视频| 中文字幕日韩精品一区二区| 成人综合日日夜夜| 欧美成人h版在线观看| www精品国产| 亚洲国产成人av网| jizz日本免费| 肉色丝袜一区二区| 影音先锋欧美资源| 美国十次综合久久| 国内精品国产三级国产在线专| 五月天激情开心网| 日本国产一区二区| 网站永久看片免费| 成人永久看片免费视频天堂| 精品久久一二三| 欧美日韩一区二区三区视频播放| 欧美性视频网站| 中文字幕在线观看日本| 欧美精品成人一区二区三区四区| 777777国产7777777| 成人免费福利片| 日韩欧美在线免费观看视频| 999国产精品永久免费视频app| 亚洲影院色无极综合| 福利在线免费视频| 中文字幕综合在线| www.色视频| 日韩欧美在线视频免费观看| 69夜色精品国产69乱| 国产在线播放一区二区三区| 青青青国产在线观看| 久久在线播放| 91传媒免费看| 深夜成人影院| 欧美精品亚州精品| 国产天堂素人系列在线视频| 日韩欧美一区二区免费| 西西44rtwww国产精品| 亚洲欧洲av色图| 亚洲最大免费视频| 国产揄拍国内精品对白| 久久精品.com| 欧美不卡在线| 相泽南亚洲一区二区在线播放| 试看120秒一区二区三区| 668精品在线视频| 国产在线69| 欧美日韩成人高清| 久久黄色精品视频| 亚洲国产一区二区三区青草影视| 午夜少妇久久久久久久久| 中文一区在线播放| b站大片免费直播| 97久久久精品综合88久久| 国产国语老龄妇女a片| 国产在线精品免费av| 天天色天天综合网| 久久丁香综合五月国产三级网站| 日本爱爱免费视频| 全部av―极品视觉盛宴亚洲| 成人中文字幕av| 久久婷婷一区| 成人观看免费完整观看| 国产精品一区亚洲| 黄色片久久久久| 久久精品天堂| 久久综合久久色| 日日夜夜精品视频免费| 爱情岛论坛亚洲首页入口章节| 秋霞成人午夜伦在线观看| 538任你躁在线精品免费| 免费观看日韩av| 手机版av在线| 九一九一国产精品| 国产成人av免费观看| 成熟亚洲日本毛茸茸凸凹| 日本精品一二三区| 91在线一区二区三区| 日本黄色特级片| 中文字幕av免费专区久久| 欧美88888| 亚洲蜜桃精久久久久久久| 天天看片中文字幕| 亚洲成人av一区二区| 伊人中文字幕在线观看| 在线观看成人免费视频| 国产精品视频久久久久久| 日韩美女在线视频| 污视频网站免费观看| 国产亚洲精品美女久久久久| 成a人片在线观看www视频| 久久韩剧网电视剧| 超免费在线视频| 日韩av电影国产| 全球中文成人在线| 懂色一区二区三区av片| 任你躁在线精品免费| 亚洲mv在线看| 午夜精品999| 欧美日韩亚洲第一| 韩国成人在线视频| 无码精品一区二区三区在线播放| 中文字幕精品三区| 久久免费黄色网址| 色国产综合视频| 99久久精品国产色欲| 亚洲国产一区二区三区四区| 国产69精品久久app免费版| 欧美高清视频一区二区| 日韩三级影视| 91亚洲午夜在线| 九九热爱视频精品视频| 97超碰免费观看| 午夜一级久久| 亚洲天堂一区二区在线观看| 99久久久免费精品国产一区二区| 午夜黄色福利视频| 精品久久久久久| 国产理论片在线观看| 亚洲日本成人女熟在线观看| 亚洲按摩av| 国产精品扒开腿做| 高清欧美性猛交xxxx黑人猛| 亚洲成人精品电影在线观看| 国产视频一区在线观看一区免费| 在线观看日本www| 国产欧美日韩中文久久| 国产一级视频在线| 91.麻豆视频| 深夜福利在线观看直播| 欧美高清视频在线播放| 男人亚洲天堂| 日本精品一区二区三区不卡无字幕| 国产一区二区三区四区老人| 青青草原国产在线视频| 国产午夜精品一区二区三区视频| 日韩和一区二区| 日韩欧美中文字幕精品| 丝袜美腿美女被狂躁在线观看| 欧美亚洲国产视频| 国产精品白浆| 欧美日韩视频免费| 国产一区在线不卡| 亚洲精品一区二区三区在线播放| 色94色欧美sute亚洲线路一久 | 日韩欧美国产一二三区| 无遮挡的视频在线观看 | 欧美人与禽zozo性伦| 成人一级片网站| 精品国产黄a∨片高清在线| 精品欧美一区二区久久久伦 | 日本欧洲国产一区二区| 亚洲不卡中文字幕无码| 亚洲尤物av| 国产美女主播在线播放| 国产成人综合在线观看| 五月天色婷婷丁香| 精品视频一区三区九区| 美女欧美视频在线观看免费| 欧美孕妇性xx| 久久91精品| 久久久久久久久久久免费视频| 99精品视频在线观看| 天天综合网入口| 亚洲电影天堂av| bl在线肉h视频大尺度| 国产精品视频500部| 亚洲精品少妇| 久久久午夜精品福利内容| 五月婷婷综合网| 色欲av永久无码精品无码蜜桃| 欧美极品少妇xxxxⅹ免费视频 | 91手机视频在线观看| 999视频精品| 国产999免费视频| 亚洲免费资源在线播放| www.国产免费| 欧美xxxx做受欧美.88| 99re8这里有精品热视频免费| 成人午夜视频在线观看免费| 91在线精品一区二区| 亚洲av无码精品一区二区| 中文字幕久久久av一区| 国产精品亚洲欧美一级在线| 性高湖久久久久久久久aaaaa| 不卡一二三区首页| 综合网在线观看| 伊人av综合网| 91精品国产色综合久久不卡粉嫩| 欧美大片免费播放| 不卡的av电影在线观看| 精品久久久久久久久久久久久久久久| 在线丨暗呦小u女国产精品| 亚洲精品66| 国产美女主播在线播放| 国产午夜亚洲精品理论片色戒| 国产精品久久久久久久成人午夜| 色在人av网站天堂精品| 亚洲婷婷伊人| 午夜精品久久久久久久99热影院| 亚洲一区在线观看视频| 国产日本在线观看|