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

數(shù)據(jù)庫時間慢了14個小時,Mybatis說,這個鍋我不背!

運維 數(shù)據(jù)庫運維
大家都知道,對于這類Bug本人是很感興趣的。直覺告訴我,應(yīng)該不是Mybatis的Bug,很可能是時區(qū)的問題。很好,今天又可以帶大家一起來排查Bug了,看看從這次的Bug排查中你能Get什么技能。

[[436824]]

本文轉(zhuǎn)載自微信公眾號「程序新視界」,作者二師兄。轉(zhuǎn)載本文請聯(lián)系程序新視界公眾號。

同事反饋一個問題:Mybatis插入數(shù)據(jù)庫的時間是昨天的,是不是因為生成Mybatis逆向工程生成的代碼有問題?

大家都知道,對于這類Bug本人是很感興趣的。直覺告訴我,應(yīng)該不是Mybatis的Bug,很可能是時區(qū)的問題。

很好,今天又可以帶大家一起來排查Bug了,看看從這次的Bug排查中你能Get什么技能。

這次研究的問題有點深奧,但結(jié)論很重要。Let's go!

問題猜想

同事反饋問題的時候,帶了自己的猜想:是不是數(shù)據(jù)庫字段設(shè)置為datetime導(dǎo)致?是不是Mybatis逆向工程生成的代碼中類型不一致導(dǎo)致的?

同事還要把datetime改為varchar……馬上被我制止了,說:先排查問題,再說解決方案,下午我也抽時間看看。

問題核查

第一步,檢查數(shù)據(jù)庫字段類型,是datetime的,沒問題。

第二步,檢查實體類中類型,是java.util.Date類型,沒問題。

第三步,Bug復(fù)現(xiàn)。

在Bug復(fù)現(xiàn)這一步,用到了單元測試。話說之前還跟朋友討論過單元測試的魅力,現(xiàn)在本人是越來越喜歡單元測試了。

項目基于Spring Boot的,單元測試如下(代碼已脫敏):

  1. @SpringBootTest 
  2. class DateTimeTests { 
  3.  
  4.  @Resource 
  5.  private UserMapper userMapper; 
  6.  
  7.  @Test 
  8.  public void testDate(){ 
  9.   User  user = new User(); 
  10.   // 省略其他字段 
  11.   user.setCreateDate(new Date()); 
  12.   userMapper.insertSelective(user); 
  13.  } 

執(zhí)行單元測試,查看數(shù)據(jù)庫中插入的數(shù)據(jù)。Bug復(fù)現(xiàn),時間的確是前一天的,與當(dāng)前時間相差14個小時。

經(jīng)過上面三步的排查,核實了數(shù)據(jù)庫字段和代碼中類型沒問題。單元測試也復(fù)現(xiàn)了問題,同事沒有欺騙我,總要眼見為實,哈哈。

于是基本確定是時區(qū)問題。

時區(qū)排查

檢查服務(wù)器時間

登錄測試服務(wù)器,執(zhí)行date命令,檢查服務(wù)器時間和時區(qū):

  1. [root@xxx ~]# date 
  2. 2021年 11月 25日 星期四 09:26:25 CST 
  3. [root@xxx ~]# date -R 
  4. Thu, 25 Nov 2021 09:33:34 +0800 

顯示時間是當(dāng)前時間,采用CST時間,最后的+0800,即東8區(qū),沒問題。

檢查數(shù)據(jù)庫時區(qū)

連接數(shù)據(jù)庫,執(zhí)行show命令:

  1. show variables like '%time_zone%'
  2.  
  3. +----------------------------+ 
  4. |Variable         | Value | 
  5. +----------------------------+ 
  6. |system_time_zone |CST    | 
  7. |time_zone       |SYSTEM | 
  • system_time_zone:全局參數(shù),系統(tǒng)時區(qū),在MySQL啟動時會檢查當(dāng)前系統(tǒng)的時區(qū)并根據(jù)系統(tǒng)時區(qū)設(shè)置全局參數(shù)system_time_zone的值。值為CST,與系統(tǒng)時間的時區(qū)一致。
  • time_zone:全局參數(shù),設(shè)置每個連接會話的時區(qū),默認為SYSTEM,使用全局參數(shù)system_time_zone的值。

檢查代碼中時區(qū)

在單元測試的方法內(nèi)再添加打印時區(qū)的代碼:

  1. @Test 
  2.  public void testDate(){ 
  3.   System.out.println(System.getProperty("user.timezone")); 
  4.   User  user = new User(); 
  5.   // 省略其他字段 
  6.   user.setCreateDate(new Date()); 
  7.   userMapper.insertSelective(user); 
  8.  } 

打印的時區(qū)為:

  1. Asia/Shanghai 

也就是說Java中使用的是UTC時區(qū)進行業(yè)務(wù)邏輯處理的,也是東八區(qū)的時間。

那么問題到底出在哪里呢?

問題基本呈現(xiàn)

經(jīng)過上述排查,基本上確定是時區(qū)的問題。這里,再補充一下上述相關(guān)的時區(qū)知識點。

UTC時間

UTC時間:世界協(xié)調(diào)時間(UTC)是世界上不同國家用來調(diào)節(jié)時鐘和時間的主要時間標(biāo)準(zhǔn),也就是零時區(qū)的時間。

UTC, Coordinated Universal Time是一個標(biāo)準(zhǔn),而不是一個時區(qū)。UTC 是一個全球通用的時間標(biāo)準(zhǔn)。全球各地都同意將各自的時間進行同步協(xié)調(diào) (coordinated),這也是UTC名字的來源:Universal Coordinated Time。

CST時間

CST時間:中央標(biāo)準(zhǔn)時間。

CST可以代表如下4個不同的時區(qū):

  • Central Standard Time (USA) UT-6:00,美國
  • Central Standard Time (Australia) UT+9:30,澳大利亞
  • China Standard Time UT+8:00,中國
  • Cuba Standard Time UT-4:00,古巴

再次分析

很顯然,這里與UTC時間無關(guān),它只是時間標(biāo)準(zhǔn)。目前Mysql中的system_time_zone是CST,而CST可以代表4個不同的時區(qū),那么,Mysql把它當(dāng)做哪個時區(qū)進行處理了呢?

簡單推算一下,中國時間是UT+8:00,美國是 UT-6:00,當(dāng)傳入中國時間,直接轉(zhuǎn)換為美國時間(未考慮時區(qū)問題),時間便慢了14個小時。

既然知道了問題,那么解決方案也就有了。

解決方案

針對上述問題可通過數(shù)據(jù)庫層面和代碼層面進行解決。

方案一:修改數(shù)據(jù)庫時區(qū)

既然是MySQL理解錯了CST指定的時區(qū),那么就將其設(shè)置為正確的。

連接Mysql數(shù)據(jù)庫,設(shè)置正確的時區(qū):

  1. [root@xxxxx ~]# mysql -uroot -p 
  2.  
  3. mysql> set global time_zone = '+8:00'
  4.  
  5. mysql> set time_zone = '+8:00' 
  6.  
  7. mysql> flush privileges

再次執(zhí)行show命令:

  1. show variables like '%time_zone%'
  2.  
  3. +----------------------------+ 
  4. |Variable         | Value | 
  5. +----------------------------+ 
  6. |system_time_zone |CST    | 
  7. |time_zone       |+08:00 | 

可以看到時區(qū)已經(jīng)成為東八區(qū)的時間了。再次執(zhí)行單元測試,問題得到解決。

此種方案也可以直接修改MySQL的my.cnf文件進行指定時區(qū)。

方案二:修改數(shù)據(jù)庫連接參數(shù)

在代碼連接數(shù)據(jù)庫時,通過參數(shù)指定所使用的時區(qū)。

在配置數(shù)據(jù)庫連接的URL后面添加上指定的時區(qū)serverTimezone=Asia/Shanghai:

  1. url: jdbc:mysql://xx.xx.xx.xx:3306/db_name?useUnicode=true&characterEncoding=utf8&autoReconnect=true&serverTimezone=Asia/Shanghai 

再次執(zhí)行單元測試,問題同樣可以得到解決。

問題完了?

經(jīng)過上述分析與操作,時區(qū)的問題已經(jīng)解決了。問題就這么完事了嗎?為什么是這樣呢?

為了驗證時區(qū)問題,在時區(qū)錯誤的數(shù)據(jù)庫中,創(chuàng)建了一個字段,該字段類型為datetime,默認值為CURRENT_TIMESTAMP。

那么,此時插入一條記錄,讓Mysql自動生成該字段的時間,你猜該字段的時間是什么?中國時間。

神奇不?為什么同樣是CST時區(qū),系統(tǒng)自動生成的時間是正確的,而代碼插入的時間就有時差問題呢?

到底是Mysql將CST時區(qū)理解為美國時間了,還是Mybatis、連接池或驅(qū)動程序?qū)⑵淅斫鉃槊绹鴷r間了?

重頭戲開始

為了追查到底是代碼中哪里出了問題,先開啟Mybatis的debug日志,看看insert時是什么值:

  1. 2021-11-25 11:05:28.367 [|1637809527983|] DEBUG 20178 --- [   scheduling-1] c.h.s.m.H.listByCondition                : ==> Parameters: 2021-11-25 11:05:27(String), 0(Integer), 1(Integer), 2(Integer), 3(Integer), 4(Integer) 

上面是insert時的參數(shù),也就是說在Mybatis層面時間是沒問題的。排除一個。

那是不是連接池或驅(qū)動程序的問題?連接池本身來講跟數(shù)據(jù)庫連接的具體操作關(guān)系不大,就直接來排查驅(qū)動程序。

Mybatis是xml中定義日期字段類型為TIMESTAMP,扒了一下mysql-connector-Java-8.0.x的源碼,發(fā)現(xiàn)SqlTimestampValueFactory是用來處理TIMESTAMP類型的。

在SqlTimestampValueFactory的構(gòu)造方法上打上斷點,執(zhí)行單元測試:

timezone

可以明確的看到,Calendar將時區(qū)設(shè)置為Locale.US,也就是美國時間,時區(qū)為CST,offset為-21600000。-21600000單位為毫秒,轉(zhuǎn)化為小時,恰好是“-6:00”,這與北京時間“GMT+08:00”恰好相差14個小時。

于是一路往上最終追溯調(diào)用鏈路,該TimeZone來自NativeServerSession的serverTimeZone,而serverTimeZone的值是由NativeProtocol類的configureTimezone方法設(shè)置的。

  1. public void configureTimezone() { 
  2.         String configuredTimeZoneOnServer = this.serverSession.getServerVariable("time_zone"); 
  3.  
  4.         if ("SYSTEM".equalsIgnoreCase(configuredTimeZoneOnServer)) { 
  5.             configuredTimeZoneOnServer = this.serverSession.getServerVariable("system_time_zone"); 
  6.         } 
  7.  
  8.         String canonicalTimezone = getPropertySet().getStringProperty(PropertyKey.serverTimezone).getValue(); 
  9.  
  10.         if (configuredTimeZoneOnServer != null) { 
  11.             // user can override this with driver properties, so don't detect if that's the case 
  12.             if (canonicalTimezone == null || StringUtils.isEmptyOrWhitespaceOnly(canonicalTimezone)) { 
  13.                 try { 
  14.                     canonicalTimezone = TimeUtil.getCanonicalTimezone(configuredTimeZoneOnServer, getExceptionInterceptor()); 
  15.                 } catch (IllegalArgumentException iae) { 
  16.                     throw ExceptionFactory.createException(WrongArgumentException.class, iae.getMessage(), getExceptionInterceptor()); 
  17.                 } 
  18.             } 
  19.         } 
  20.  
  21.         if (canonicalTimezone != null && canonicalTimezone.length() > 0) { 
  22.          // 此處設(shè)置TimeZone 
  23.             this.serverSession.setServerTimeZone(TimeZone.getTimeZone(canonicalTimezone)); 
  24.  
  25.             if (!canonicalTimezone.equalsIgnoreCase("GMT") && this.serverSession.getServerTimeZone().getID().equals("GMT")) { 
  26.                 throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("Connection.9", new Object[] { canonicalTimezone }), 
  27.                         getExceptionInterceptor()); 
  28.             } 
  29.         } 
  30.  
  31.     } 

debug跟蹤一下上述代碼,顯示信息如下:

CST獲得

至此,通過canonicalTimezone值的獲取,可以看出URL后面配置serverTimezone=Asia/Shanghai的作用了。其中,上面第一個代碼塊獲取time_zone的值,第二個代碼塊中獲取system_time_zone的值。這與查詢數(shù)據(jù)庫獲得的值一致。

因為出問題時并未在url中添加參數(shù)serverTimezone=Asia/Shanghai,所以走canonicalTimezone為null的情況。隨后邏輯中調(diào)用了TimeUtil.getCanonicalTimezone方法:

  1. public static String getCanonicalTimezone(String timezoneStr, ExceptionInterceptor exceptionInterceptor) { 
  2.         if (timezoneStr == null) { 
  3.             return null
  4.         } 
  5.  
  6.         timezoneStr = timezoneStr.trim(); 
  7.  
  8.         // handle '+/-hh:mm' form ... 
  9.         if (timezoneStr.length() > 2) { 
  10.             if ((timezoneStr.charAt(0) == '+' || timezoneStr.charAt(0) == '-') && Character.isDigit(timezoneStr.charAt(1))) { 
  11.                 return "GMT" + timezoneStr; 
  12.             } 
  13.         } 
  14.  
  15.         synchronized (TimeUtil.class) { 
  16.             if (timeZoneMappings == null) { 
  17.                 loadTimeZoneMappings(exceptionInterceptor); 
  18.             } 
  19.         } 
  20.  
  21.         String canonicalTz; 
  22.         if ((canonicalTz = timeZoneMappings.getProperty(timezoneStr)) != null) { 
  23.             return canonicalTz; 
  24.         } 
  25.  
  26.         throw ExceptionFactory.createException(InvalidConnectionAttributeException.class, 
  27.                 Messages.getString("TimeUtil.UnrecognizedTimezoneId", new Object[] { timezoneStr }), exceptionInterceptor); 
  28.     } 

上述代碼中最終走到了loadTimeZoneMappings(exceptionInterceptor);方法:

  1. private static void loadTimeZoneMappings(ExceptionInterceptor exceptionInterceptor) { 
  2.         timeZoneMappings = new Properties(); 
  3.         try { 
  4.             timeZoneMappings.load(TimeUtil.class.getResourceAsStream(TIME_ZONE_MAPPINGS_RESOURCE)); 
  5.         } catch (IOException e) { 
  6.             throw ExceptionFactory.createException(Messages.getString("TimeUtil.LoadTimeZoneMappingError"), exceptionInterceptor); 
  7.         } 
  8.         // bridge all Time Zone ids known by Java 
  9.         for (String tz : TimeZone.getAvailableIDs()) { 
  10.             if (!timeZoneMappings.containsKey(tz)) { 
  11.                 timeZoneMappings.put(tz, tz); 
  12.             } 
  13.         } 
  14.     } 

該方法加載了配置文件"/com/mysql/cj/util/TimeZoneMapping.properties"里面的值,經(jīng)過轉(zhuǎn)換,timeZoneMappings中,對應(yīng)CST的為"CST"。

最終得到canonicalTimezone為“CST”,而TimeZone獲得是通過TimeZone.getTimeZone(canonicalTimezone)方法獲得的。

也就是說TimeZone.getTimeZone("CST")的值為美國時間。寫個單元測試驗證一下:

  1. public class TimeZoneTest { 
  2.  
  3.  @Test 
  4.  public void testTimeZone(){ 
  5.   System.out.println(TimeZone.getTimeZone("CST")); 
  6.  } 

打印結(jié)果:

  1. sun.util.calendar.ZoneInfo[id="CST",offset=-21600000,dstSavings=3600000,useDaylight=true,transitions=235,lastRule=java.util.SimpleTimeZone[id=CST,offset=-21600000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDay=8,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=3,endMonth=10,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=0]] 

很顯然,該方法傳入CST之后,默認是美國時間。

至此,問題原因基本明朗:

  • Mysql中設(shè)置的server_time_zone為CST,time_zone為SYSTEM。
  • Mysql驅(qū)動查詢到time_zone為SYSTEM,于是使用server_time_zone的值,為”CST“。
  • JDK中TimeZone.getTimeZone("CST")獲得的值為美國時區(qū);
  • 以美國時區(qū)構(gòu)造的Calendar類;
  • SqlTimestampValueFactory使用上述Calendar來格式化系統(tǒng)獲取的中國時間,時差問題便出現(xiàn)了;
  • 最終反映在數(shù)據(jù)庫數(shù)據(jù)上就是錯誤的時間。

serverVariables變量

再延伸一下,其中server_time_zone和time_zone都來自于NativeServerSession的serverVariables變量,該變量在NativeSession的loadServerVariables方法中進行初始化,關(guān)鍵代碼:

  1. if (versionMeetsMinimum(5, 1, 0)) { 
  2.                 StringBuilder queryBuf = new StringBuilder(versionComment).append("SELECT"); 
  3.                 queryBuf.append("  @@session.auto_increment_increment AS auto_increment_increment"); 
  4.                 queryBuf.append(", @@character_set_client AS character_set_client"); 
  5.                 queryBuf.append(", @@character_set_connection AS character_set_connection"); 
  6.                 queryBuf.append(", @@character_set_results AS character_set_results"); 
  7.                 queryBuf.append(", @@character_set_server AS character_set_server"); 
  8.                 queryBuf.append(", @@collation_server AS collation_server"); 
  9.                 queryBuf.append(", @@collation_connection AS collation_connection"); 
  10.                 queryBuf.append(", @@init_connect AS init_connect"); 
  11.                 queryBuf.append(", @@interactive_timeout AS interactive_timeout"); 
  12.                 if (!versionMeetsMinimum(5, 5, 0)) { 
  13.                     queryBuf.append(", @@language AS language"); 
  14.                 } 
  15.                 queryBuf.append(", @@license AS license"); 
  16.                 queryBuf.append(", @@lower_case_table_names AS lower_case_table_names"); 
  17.                 queryBuf.append(", @@max_allowed_packet AS max_allowed_packet"); 
  18.                 queryBuf.append(", @@net_write_timeout AS net_write_timeout"); 
  19.                 queryBuf.append(", @@performance_schema AS performance_schema"); 
  20.                 if (!versionMeetsMinimum(8, 0, 3)) { 
  21.                     queryBuf.append(", @@query_cache_size AS query_cache_size"); 
  22.                     queryBuf.append(", @@query_cache_type AS query_cache_type"); 
  23.                 } 
  24.                 queryBuf.append(", @@sql_mode AS sql_mode"); 
  25.                 queryBuf.append(", @@system_time_zone AS system_time_zone"); 
  26.                 queryBuf.append(", @@time_zone AS time_zone"); 
  27.                 if (versionMeetsMinimum(8, 0, 3) || (versionMeetsMinimum(5, 7, 20) && !versionMeetsMinimum(8, 0, 0))) { 
  28.                     queryBuf.append(", @@transaction_isolation AS transaction_isolation"); 
  29.                 } else { 
  30.                     queryBuf.append(", @@tx_isolation AS transaction_isolation"); 
  31.                 } 
  32.                 queryBuf.append(", @@wait_timeout AS wait_timeout"); 
  33.  
  34.                 NativePacketPayload resultPacket = sendCommand(this.commandBuilder.buildComQuery(null, queryBuf.toString()), false, 0); 
  35.                 Resultset rs = ((NativeProtocol) this.protocol).readAllResults(-1, false, resultPacket, falsenull
  36.                         new ResultsetFactory(Type.FORWARD_ONLY, null)); 
  37.                 Field[] f = rs.getColumnDefinition().getFields(); 
  38.                 if (f.length > 0) { 
  39.                     ValueFactory<String> vf = new StringValueFactory(this.propertySet); 
  40.                     Row r; 
  41.                     if ((r = rs.getRows().next()) != null) { 
  42.                         for (int i = 0; i < f.length; i++) { 
  43.                             this.protocol.getServerSession().getServerVariables().put(f[i].getColumnLabel(), r.getValue(i, vf)); 
  44.                         } 
  45.                     } 
  46.                 } 

在上述StringBuilder的append操作中,有"@@time_zone AS time_zone"和"@@system_time_zone AS system_time_zone"兩個值,然后查詢數(shù)據(jù)庫,從數(shù)據(jù)庫獲得值之后,put到serverVariables中。

再來debug一下:

system_time_zone

可以看出system_time_zone的值為CST。

time_zone

同樣time_zone的值為“SYSTEM”。

根據(jù)代碼中的提示,拼接與代碼一樣的SQL查詢一下數(shù)據(jù)庫:

  1. select @@time_zone; 
  2.  
  3. SYSTEM 

值的確是“SYSTEM”。此時,我們又得出另外一個查詢Mysql當(dāng)前時區(qū)的方法。

至此,該問題的排查完美收官。大出一口氣。

小結(jié)

在上述問題排查的過程中,多次用到單元測試,這也是單元測試的魅力所在,用最簡單的代碼,最輕量的邏輯,最節(jié)省時間的方式來驗證和追蹤錯誤。

再回顧一下上述Bug排查中用到和學(xué)到的知識點:

  • Linux日期查看,時區(qū)查看及衍生如何配置時區(qū);
  • Mysql時區(qū)查看;
  • Spring Boot單元測試;
  • Java時區(qū)獲取;
  • UTC時間和CST時間;
  • 兩種解決時區(qū)問題的方案;
  • 閱讀、debug Mysql驅(qū)動源代碼;
  • TimeZone.getTimeZone("CST")默認時區(qū)為美國時區(qū);
  • Mysql驅(qū)動中處理時區(qū)問題基本流程邏輯;
  • Mybatis debug日志相關(guān)打印;
  • 其他相關(guān)知識。 

通過本篇Bug查找的文章,你學(xué)到了什么?如果有那么一點啟發(fā),不要吝嗇,給點個贊吧!

 

責(zé)任編輯:武曉燕 來源: 程序新視界
相關(guān)推薦

2017-09-12 16:18:22

ICO區(qū)塊鏈互聯(lián)網(wǎng)+

2019-06-03 14:38:11

AWS挖掘機光纜

2020-02-20 16:21:46

遠程辦公

2015-12-09 13:51:21

Intelskylake散熱器

2021-04-13 17:38:38

區(qū)塊鏈比特幣安全

2024-08-05 08:00:53

2018-10-19 16:35:20

運維

2018-05-02 14:30:33

數(shù)據(jù)庫運維優(yōu)化故障

2018-05-08 09:49:15

數(shù)據(jù)庫運維優(yōu)化

2019-12-03 13:57:38

CIO背鍋IT

2019-01-16 18:11:28

程序員技能開發(fā)者

2017-08-23 17:11:40

WI-FI流量路由器

2021-04-16 09:20:34

黑客DDoS網(wǎng)絡(luò)攻擊

2023-04-26 07:16:25

游戲掉幀CPU

2019-12-17 10:01:40

開發(fā)技能代碼

2017-06-09 13:36:33

人工智能深度學(xué)習(xí)

2017-09-25 10:52:27

2020-12-09 11:00:44

Nginx 運維Tomcat

2021-11-03 16:25:26

Linux磁盤空間命令

2025-03-24 08:00:00

數(shù)據(jù)庫開發(fā)代碼
點贊
收藏

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

亚洲欧洲99久久| 一区二区三区四区五区在线| 在线亚洲人成电影网站色www| 蜜桃传媒视频麻豆第一区免费观看 | 久久久久久久久爱| 成人国产精品久久久网站| 欧美成人xxxx| 亚洲免费在线观看| 欧美三日本三级少妇三99| 国产伦理吴梦梦伦理| 日韩午夜黄色| 久久精品中文字幕电影| 黄色国产在线观看| 99精品女人在线观看免费视频| 亚洲电影在线播放| 亚洲女人毛片| 日韩国产福利| 国产乱淫av一区二区三区| 日本成人在线视频网址| 青娱乐国产在线视频| 成人3d精品动漫精品一二三| 日韩欧美成人一区| 91制片厂毛片| 国模精品视频| 中文字幕综合网| 茄子视频成人在线观看| 蜜桃视频在线观看www| 韩国女主播成人在线观看| 国产97在线亚洲| 国产精选第一页| 欧美一区二区三区久久精品| 最近2019中文字幕在线高清| 中国美女乱淫免费看视频| 亚洲图片小说区| 欧美丝袜丝交足nylons| 少妇高清精品毛片在线视频| 性网站在线观看| 亚洲素人一区二区| 一区二区三区四区在线视频 | 一区二区三区久久精品| 日韩www视频| 成人激情自拍| 精品少妇一区二区| 中国老熟女重囗味hdxx| www.久久热| 91精品在线观看入口| 亚洲欧美自拍另类日韩| 丁香婷婷久久| 欧美日韩在线播放三区| 奇米影音第四色| 欧美天堂一区二区| 欧美日韩一区在线观看| 手机免费av片| 91国产精品| 日韩一级二级三级| 日本黄色三级网站| 亚洲精品不卡在线观看 | 国产91免费在线观看| 国产成人精品一区二区三区四区 | 亚洲色图插插| 欧美乱妇40p| 国产在线综合网| 99精品免费网| 国产99久久精品一区二区永久免费| 国产一级一级国产| 日韩高清在线观看| 国产久一一精品| 国产欧美一级片| 国产成人精品三级| 国产亚洲第一区| 欧美日韩在线精品一区二区三区激情综 | 在线视频免费在线观看一区二区| 欧美做爰性生交视频| 亚洲精品国产欧美在线观看| 免费观看日韩电影| 91麻豆国产精品| 亚洲精品人妻无码| 91啦中文在线观看| 亚洲国产另类久久久精品极度| 日韩欧美小视频| 亚洲最色的网站| 国产免费毛卡片| 国产精品诱惑| 精品免费视频.| 天天躁日日躁aaaa视频| 希岛爱理一区二区三区| 性欧美办公室18xxxxhd| 天堂av免费在线观看| 极品少妇一区二区三区精品视频| 国产精品久久国产精品| 国产理论电影在线观看| 亚洲色大成网站www久久九九| 成人免费性视频| 国产超碰精品| 日韩精品一区二区三区中文不卡 | 欧美a级成人淫片免费看| 欧美成人精品不卡视频在线观看| 在线观看亚洲欧美| 精品一区二区三区免费播放| 精品国产乱码久久久久久丨区2区| 成人在线免费电影| 亚洲图片欧美色图| 在线免费观看视频黄| 黄色成人美女网站| 久久久精品久久久| 中文字幕av影院| 国产宾馆实践打屁股91| 日韩欧美一区二区在线观看 | 成人福利在线观看| 亚州av在线播放| 亚洲柠檬福利资源导航| 任你操这里只有精品| 亚洲综合网站| www.久久色.com| 天堂网中文字幕| 国产91高潮流白浆在线麻豆| 亚洲日本欧美在线| 午夜影院在线播放| 欧美电影免费提供在线观看| 免费黄色国产视频| 久久人人97超碰国产公开结果| 97久久人人超碰caoprom欧美| 成年人视频免费在线观看| 午夜电影网亚洲视频| 色哟哟免费视频| 91久久夜色精品国产按摩| 国产成人91久久精品| 少妇高潮一区二区三区99小说| 亚洲欧美一区二区三区极速播放| 黄色国产小视频| 少妇精品久久久一区二区| 国语自产在线不卡| 蜜臀av在线观看| 亚洲国产精品久久一线不卡| 秋霞午夜鲁丝一区二区| 国产精品7m凸凹视频分类| 国产精品情侣自拍| 国产爆初菊在线观看免费视频网站 | 最新欧美日韩亚洲| 成人国产综合| 正在播放欧美视频| 波多野结衣一本一道| 久久久影视传媒| 日本黄色三级大片| 亚洲8888| 国产成人在线精品| 国产高清视频在线观看| 色综合久久九月婷婷色综合| 波多野吉衣中文字幕| 久久一区二区三区四区五区 | 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美成人精品三级在线观看| 精品区在线观看| 一区二区免费视频| 亚洲一区和二区| 亚洲国产精品一区制服丝袜| 久久国产精品99久久久久久丝袜| 九色porny自拍视频在线播放 | 国产精品毛片一区视频| xxxx视频在线| 精品夜色国产国偷在线| 无码一区二区三区在线观看| 国产女主播在线一区二区| 黄色永久免费网站| 91精品啪在线观看国产81旧版| 91免费精品国偷自产在线| 手机在线免费看av| 亚洲韩国日本中文字幕| 中文字幕高清在线免费播放| 亚洲国产精品高清| 中文字幕55页| 99av国产精品欲麻豆| 欧美亚洲免费高清在线观看 | 欧美日韩色网| 亚洲精品不卡在线| 无码人妻精品一区二区三区蜜桃91| 中文字幕高清一区| 一级日本黄色片| 亚洲最黄网站| 亚洲国产午夜伦理片大全在线观看网站 | 精品久久久久久久大神国产| 国产又粗又猛又爽视频| 久久99精品久久久久久国产越南 | 亚洲天堂网在线观看| 自拍偷拍第八页| 一个色在线综合| 国产毛片久久久久久久| 国产麻豆成人精品| 六月丁香婷婷在线| 午夜精品国产| 日本一区二区三区视频在线观看| 欧美专区视频| 国产成人亚洲精品| 色呦呦在线免费观看| 亚洲欧美一区二区三区四区| 国产视频aaa| 一本一道波多野结衣一区二区| 一级性生活免费视频| 91在线精品一区二区| 手机免费av片| 久久一区视频| 国产xxxx振车| 久久影院一区| 欧美日韩国产不卡在线看| 国产精品日本一区二区三区在线| 日韩男女性生活视频| 秋霞在线视频| 久久精品99久久久香蕉| 激情小视频在线| 精品999在线播放| 一区二区三区www污污污网站| 黄色一区二区在线| 欧美成人手机视频| 国产精品水嫩水嫩| 亚洲乱码国产乱码精品精大量| 国产一二精品视频| 精品999在线| 日韩国产欧美一区二区三区| av7777777| 伊人影院久久| 国产成人一区二区三区别| 日韩在线看片| 日本免费高清一区二区| 欧美五码在线| 国产乱码精品一区二区三区卡| 国产精品一区二区精品| 国产精品日韩欧美大师| 国产日韩另类视频一区| 7777精品视频| 黄色在线免费观看网站| 欧美日韩国产123| av在线影院| 久久久999国产精品| 性开放的欧美大片| 中文字幕国内精品| 福利视频在线播放| 亚洲欧洲午夜一线一品| 桃花色综合影院| 亚洲国产精品va| 姝姝窝人体www聚色窝| 亚洲国产精品推荐| 十八禁一区二区三区| 亚洲电影av在线| 午夜视频在线免费播放| 亚洲精品99久久久久中文字幕| 色婷婷激情五月| 日韩精品福利在线| 先锋av资源站| 亚洲欧美国产一本综合首页| 毛片网站在线| 国产一区二区三区在线观看视频 | 日av在线播放中文不卡| 人人视频精品| 国产精品一区二区久久| 亚洲精品毛片| 亚洲综合av影视| а√中文在线天堂精品| 精品蜜桃一区二区三区| 亚洲人成精品久久久| 秋霞在线观看一区二区三区| 黑丝美女一区二区| 亚洲精品免费在线看| 国产精品不卡| 精品国产一区二区三区无码| 一本一本久久| 国产xxxxx视频| 九九精品视频在线看| www.四虎在线| 国产亚洲精久久久久久| 欧美性生交大片| 亚洲影视在线播放| 国产专区第一页| 91.成人天堂一区| 性生活三级视频| 亚洲美女又黄又爽在线观看| 成人福利在线| 欧美极品少妇与黑人| 日本不卡一二三| 91精品视频在线| 青青草原在线亚洲| 亚洲欧美国产不卡| 精品动漫3d一区二区三区免费| 午夜精品久久久内射近拍高清 | 欧美日本中文| 日本精品一区在线观看| 久久电影网电视剧免费观看| 性猛交╳xxx乱大交| 国产欧美一区二区精品忘忧草| www.av免费| 欧美午夜电影在线| 国产婷婷一区二区三区久久| 亚洲国产成人91精品| 91ph在线| 97在线观看免费| 亚洲精品一区二区在线播放∴| 国产在线一区二| 国产精品精品| 精品国产成人av在线免| 懂色av一区二区三区蜜臀| 日本理论中文字幕| 亚洲www啪成人一区二区麻豆| 亚洲一卡二卡在线观看| 日韩高清有码在线| 直接在线观看的三级网址| 国产精品极品美女粉嫩高清在线| 伊人www22综合色| 亚洲综合首页| 久久久久久夜| 少妇一级淫免费观看 | 亚洲伊人成人网| 日韩亚洲电影在线| 淫片在线观看| 国产精品久久久久久久久久东京| 精品精品精品| av片在线免费| 国产一二精品视频| 天堂av免费在线| 在线视频观看一区| 天天综合在线视频| 欧美日韩国产123| 韩国三级大全久久网站| 视频三区二区一区| 性一交一乱一区二区洋洋av| 69亚洲乱人伦| 一二三区精品视频| 国产av无码专区亚洲av麻豆| 中文字幕日韩av| 日本一区二区电影| 青青影院一区二区三区四区| 美日韩精品视频| 波多野结衣先锋影音| 亚洲午夜电影在线| 亚洲黄色小说网址| 欧美精品情趣视频| 日本超碰一区二区| 无码毛片aaa在线| 国产精品综合av一区二区国产馆| 黄色精品视频在线观看| 欧美日韩一级大片网址| 午夜免费视频在线国产| 国产精品精品久久久| 欧美精品羞羞答答| 美女少妇一区二区| 国产精品蜜臀av| 国产又粗又猛又爽又黄91| 日韩中文字幕在线免费观看| 欧美性www| 日日噜噜夜夜狠狠久久丁香五月 | 欧美性猛交xxxxxxxx| 国产高清一区在线观看| 国产乱人伦真实精品视频| 日韩免费av| 午夜啪啪小视频| 亚洲免费观看高清完整版在线| 精品久久在线观看| 国内偷自视频区视频综合| 日韩有码一区| 蜜臀视频一区二区三区| 中文字幕一区二区三中文字幕| 一级片aaaa| 欧美激情视频在线| 外国成人在线视频| 黑人粗进入欧美aaaaa| 一色屋精品亚洲香蕉网站| 国产wwwxxx| 5566成人精品视频免费| 国内精品久久久久久99蜜桃| 91制片厂毛片| 亚洲一区二区三区在线| 日本在线视频1区| 国产日韩av高清| 亚洲国产mv| 午夜黄色福利视频| 日韩免费视频一区| 欧美xxxxxx| 久久天天东北熟女毛茸茸| 99视频热这里只有精品免费| www.五月婷婷.com| 麻豆国产va免费精品高清在线| 巨人精品**| 最新天堂在线视频| 午夜精品国产更新| 阿v免费在线观看| 国产高清精品一区| 日韩高清一级片| 久久久国产精华液| 国产亚洲欧美日韩精品| japanese色系久久精品| 成人免费毛片播放| 亚洲精品国产视频| 国产九九在线| 国产精品xxxx| 麻豆精品一二三| 女人十八岁毛片| 久久久精品2019中文字幕神马| 久9久9色综合| 免费啪视频在线观看| 欧美日韩高清影院| 性xxxxfreexxxxx欧美丶| 中国一级黄色录像|