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

Spring Boot + MyBatis + MySQL 實現讀寫分離!

開發 后端 MySQL
讀寫分離要做的事情就是對于一條SQL該選擇哪個數據庫去執行,至于誰來做選擇數據庫這件事兒,無非兩個,要么中間件幫我們做,要么程序自己做。

 1、引言

讀寫分離要做的事情就是對于一條SQL該選擇哪個數據庫去執行,至于誰來做選擇數據庫這件事兒,無非兩個,要么中間件幫我們做,要么程序自己做。

因此,一般來講,讀寫分離有兩種實現方式。第一種是依靠中間件(比如:MyCat),也就是說應用程序連接到中間件,中間件幫我們做SQL分離;第二種是應用程序自己去做分離。這里我們選擇程序自己來做,主要是利用Spring提供的路由數據源,以及AOP

然而,應用程序層面去做讀寫分離最大的弱點(不足之處)在于無法動態增加數據庫節點,因為數據源配置都是寫在配置中的,新增數據庫意味著新加一個數據源,必然改配置,并重啟應用。當然,好處就是相對簡單。

2、AbstractRoutingDataSource

基于特定的查找key路由到特定的數據源。它內部維護了一組目標數據源,并且做了路由key與目標數據源之間的映射,提供基于key查找數據源的方法。

3、實踐

3.1. maven依賴 

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
  4.     <modelVersion>4.0.0</modelVersion>  
  5.     <groupId>com.cjs.example</groupId>  
  6.     <artifactId>cjs-datasource-demo</artifactId>  
  7.     <version>0.0.1-SNAPSHOT</version>  
  8.     <packaging>jar</packaging>  
  9.     <name>cjs-datasource-demo</name>  
  10.     <description></description>  
  11.     <parent>  
  12.         <groupId>org.springframework.boot</groupId>  
  13.         <artifactId>spring-boot-starter-parent</artifactId>  
  14.         <version>2.0.5.RELEASE</version>  
  15.         <relativePath/> <!-- lookup parent from repository -->  
  16.     </parent>  
  17.     <properties>  
  18.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
  19.         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>  
  20.         <java.version>1.8</java.version>  
  21.     </properties>  
  22.     <dependencies>  
  23.         <dependency>  
  24.             <groupId>org.springframework.boot</groupId>  
  25.             <artifactId>spring-boot-starter-aop</artifactId>  
  26.         </dependency>  
  27.         <dependency>  
  28.             <groupId>org.springframework.boot</groupId>  
  29.             <artifactId>spring-boot-starter-jdbc</artifactId>  
  30.         </dependency>  
  31.         <dependency>  
  32.             <groupId>org.springframework.boot</groupId>  
  33.             <artifactId>spring-boot-starter-web</artifactId>  
  34.         </dependency>  
  35.         <dependency>  
  36.             <groupId>org.mybatis.spring.boot</groupId>  
  37.             <artifactId>mybatis-spring-boot-starter</artifactId>  
  38.             <version>1.3.2</version>  
  39.         </dependency>  
  40.         <dependency>  
  41.             <groupId>org.apache.commons</groupId>  
  42.             <artifactId>commons-lang3</artifactId>  
  43.             <version>3.8</version>  
  44.         </dependency>  
  45.         <dependency>  
  46.             <groupId>mysql</groupId>  
  47.             <artifactId>mysql-connector-java</artifactId>  
  48.             <scope>runtime</scope>  
  49.         </dependency>  
  50.         <dependency>  
  51.             <groupId>org.springframework.boot</groupId>  
  52.             <artifactId>spring-boot-starter-test</artifactId>  
  53.             <scope>test</scope>  
  54.         </dependency>  
  55.     </dependencies>  
  56.     <build>  
  57.         <plugins>  
  58.             <plugin>  
  59.                 <groupId>org.springframework.boot</groupId>  
  60.                 <artifactId>spring-boot-maven-plugin</artifactId>  
  61.             </plugin>  
  62.             <!--<plugin>  
  63.                 <groupId>org.mybatis.generator</groupId>  
  64.                 <artifactId>mybatis-generator-maven-plugin</artifactId>  
  65.                 <version>1.3.5</version>  
  66.                 <dependencies>  
  67.                     <dependency>  
  68.                         <groupId>mysql</groupId>  
  69.                         <artifactId>mysql-connector-java</artifactId>  
  70.                         <version>5.1.46</version>  
  71.                     </dependency>  
  72.                 </dependencies>  
  73.                 <configuration>  
  74.                     <configurationFile>${basedir}/src/main/resources/myBatisGeneratorConfig.xml</configurationFile>  
  75.                     <overwrite>true</overwrite>  
  76.                 </configuration>  
  77.                 <executions>  
  78.                     <execution>  
  79.                         <id>Generate MyBatis Artifacts</id>  
  80.                         <goals>  
  81.                             <goal>generate</goal>  
  82.                         </goals>  
  83.                     </execution>  
  84.                 </executions>  
  85.             </plugin>-->  
  86.         </plugins>  
  87.     </build>  
  88. </project> 

3.2. 數據源配置

application.yml 

  1. spring:  
  2.   datasource:  
  3.     master:  
  4.       jdbc-url: jdbc:mysql://192.168.102.31:3306/test  
  5.       username: root  
  6.       password: 123456  
  7.       driver-class-name: com.mysql.jdbc.Driver  
  8.     slave1:  
  9.       jdbc-url: jdbc:mysql://192.168.102.56:3306/test  
  10.       username: pig   # 只讀賬戶  
  11.       password: 123456  
  12.       driver-class-name: com.mysql.jdbc.Driver  
  13.     slave2:  
  14.       jdbc-url: jdbc:mysql://192.168.102.36:3306/test  
  15.       username: pig   # 只讀賬戶  
  16.       password: 123456  
  17.       driver-class-name: com.mysql.jdbc.Driver 

多數據源配置 

  1. package com.cjs.example.config;  
  2. import com.cjs.example.bean.MyRoutingDataSource;  
  3. import com.cjs.example.enums.DBTypeEnum;  
  4. import org.springframework.beans.factory.annotation.Qualifier;  
  5. import org.springframework.boot.context.properties.ConfigurationProperties;  
  6. import org.springframework.boot.jdbc.DataSourceBuilder;  
  7. import org.springframework.context.annotation.Bean;  
  8. import org.springframework.context.annotation.Configuration;  
  9. import javax.sql.DataSource;  
  10. import java.util.HashMap;  
  11. import java.util.Map;  
  12. /**  
  13.  * 關于數據源配置,參考SpringBoot官方文檔第79章《Data Access》  
  14.  * 79. Data Access  
  15.  * 79.1 Configure a Custom DataSource  
  16.  * 79.2 Configure Two DataSources  
  17.  */  
  18. @Configuration  
  19. public class DataSourceConfig {  
  20.     @Bean  
  21.     @ConfigurationProperties("spring.datasource.master")  
  22.     public DataSource masterDataSource() {  
  23.         return DataSourceBuilder.create().build();  
  24.     }  
  25.     @Bean  
  26.     @ConfigurationProperties("spring.datasource.slave1")  
  27.     public DataSource slave1DataSource() {  
  28.         return DataSourceBuilder.create().build();  
  29.     }  
  30.     @Bean  
  31.     @ConfigurationProperties("spring.datasource.slave2")  
  32.     public DataSource slave2DataSource() {  
  33.         return DataSourceBuilder.create().build();  
  34.     }  
  35.     @Bean  
  36.     public DataSource myRoutingDataSource(@Qualifier("masterDataSource") DataSource masterDataSource,  
  37.                                           @Qualifier("slave1DataSource") DataSource slave1DataSource,  
  38.                                           @Qualifier("slave2DataSource") DataSource slave2DataSource) {  
  39.         Map<Object, Object> targetDataSources = new HashMap<>();  
  40.         targetDataSources.put(DBTypeEnum.MASTER, masterDataSource);  
  41.         targetDataSources.put(DBTypeEnum.SLAVE1, slave1DataSource);  
  42.         targetDataSources.put(DBTypeEnum.SLAVE2, slave2DataSource);  
  43.         MyRoutingDataSource myRoutingDataSource = new MyRoutingDataSource();  
  44.         myRoutingDataSource.setDefaultTargetDataSource(masterDataSource);  
  45.         myRoutingDataSource.setTargetDataSources(targetDataSources);  
  46.         return myRoutingDataSource;  
  47.     }  

這里,我們配置了4個數據源,1個master,2兩個slave,1個路由數據源。前3個數據源都是為了生成第4個數據源,而且后續我們只用這最后一個路由數據源。

Spring Boot 最新基礎教程和示例源碼:https://github.com/javastacks/spring-boot-best-practice

MyBatis配置 

  1. package com.cjs.example.config;  
  2. import org.apache.ibatis.session.SqlSessionFactory;  
  3. import org.mybatis.spring.SqlSessionFactoryBean;  
  4. import org.springframework.context.annotation.Bean;  
  5. import org.springframework.context.annotation.Configuration;  
  6. import org.springframework.core.io.support.PathMatchingResourcePatternResolver; 
  7. import org.springframework.jdbc.datasource.DataSourceTransactionManager;  
  8. import org.springframework.transaction.PlatformTransactionManager;  
  9. import org.springframework.transaction.annotation.EnableTransactionManagement;  
  10. import javax.annotation.Resource;  
  11. import javax.sql.DataSource;  
  12. @EnableTransactionManagement  
  13. @Configuration  
  14. public class MyBatisConfig {  
  15.     @Resource(name = "myRoutingDataSource" 
  16.     private DataSource myRoutingDataSource;  
  17.     @Bean  
  18.     public SqlSessionFactory sqlSessionFactory() throws Exception {  
  19.         SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();  
  20.         sqlSessionFactoryBean.setDataSource(myRoutingDataSource);  
  21.         sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));  
  22.         return sqlSessionFactoryBean.getObject();  
  23.     }  
  24.     @Bean  
  25.     public PlatformTransactionManager platformTransactionManager() {  
  26.         return new DataSourceTransactionManager(myRoutingDataSource);  
  27.     }  

由于Spring容器中現在有4個數據源,所以我們需要為事務管理器和MyBatis手動指定一個明確的數據源。另外,Spring 系列面試題和答案全部整理好了,微信搜索Java技術棧,在后臺發送:面試,可以在線閱讀。

3.3. 設置路由key / 查找數據源

目標數據源就是那前3個這個我們是知道的,但是使用的時候是如果查找數據源的呢?

首先,我們定義一個枚舉來代表這三個數據源 

  1. package com.cjs.example.enums;  
  2. public enum DBTypeEnum {  
  3.     MASTER, SLAVE1, SLAVE2;  

接下來,通過ThreadLocal將數據源設置到每個線程上下文中 

  1. package com.cjs.example.bean;  
  2. import com.cjs.example.enums.DBTypeEnum;  
  3. import java.util.concurrent.atomic.AtomicInteger; 
  4. public class DBContextHolder {  
  5.     private static final ThreadLocal<DBTypeEnum> contextHolder = new ThreadLocal<>();  
  6.     private static final AtomicInteger counter = new AtomicInteger(-1);  
  7.     public static void set(DBTypeEnum dbType) {  
  8.         contextHolder.set(dbType);  
  9.     } 
  10.     public static DBTypeEnum get() {  
  11.         return contextHolder.get();  
  12.     }  
  13.     public static void master() {  
  14.         set(DBTypeEnum.MASTER);  
  15.         System.out.println("切換到master");  
  16.     }  
  17.     public static void slave() { 
  18.         //  輪詢  
  19.         int index = counter.getAndIncrement() % 2;  
  20.         if (counter.get() > 9999) {  
  21.             counter.set(-1);  
  22.         }  
  23.         if (index == 0) {  
  24.             set(DBTypeEnum.SLAVE1);  
  25.             System.out.println("切換到slave1");  
  26.         }else {  
  27.             set(DBTypeEnum.SLAVE2);  
  28.             System.out.println("切換到slave2");  
  29.         }  
  30.     }  

獲取路由key 

  1. package com.cjs.example.bean;  
  2. import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;  
  3. import org.springframework.lang.Nullable;  
  4. public class MyRoutingDataSource extends AbstractRoutingDataSource {  
  5.     @Nullable  
  6.     @Override  
  7.     protected Object determineCurrentLookupKey() {  
  8.         return DBContextHolder.get();  
  9.     }  

設置路由key

默認情況下,所有的查詢都走從庫,插入/修改/刪除走主庫。我們通過方法名來區分操作類型(CRUD) 

  1. package com.cjs.example.aop;  
  2. import com.cjs.example.bean.DBContextHolder;  
  3. import org.apache.commons.lang3.StringUtils;  
  4. import org.aspectj.lang.JoinPoint; 
  5. import org.aspectj.lang.annotation.Aspect;  
  6. import org.aspectj.lang.annotation.Before;  
  7. import org.aspectj.lang.annotation.Pointcut;  
  8. import org.springframework.stereotype.Component;  
  9. @Aspect  
  10. @Component  
  11. public class DataSourceAop {  
  12.     @Pointcut("!@annotation(com.cjs.example.annotation.Master) " +  
  13.             "&& (execution(* com.cjs.example.service..*.select*(..)) " +  
  14.             "|| execution(* com.cjs.example.service..*.get*(..)))")  
  15.     public void readPointcut() {  
  16.     }  
  17.     @Pointcut("@annotation(com.cjs.example.annotation.Master) " +  
  18.             "|| execution(* com.cjs.example.service..*.insert*(..)) " +  
  19.             "|| execution(* com.cjs.example.service..*.add*(..)) " +  
  20.             "|| execution(* com.cjs.example.service..*.update*(..)) " + 
  21.             "|| execution(* com.cjs.example.service..*.edit*(..)) " +  
  22.             "|| execution(* com.cjs.example.service..*.delete*(..)) " +  
  23.             "|| execution(* com.cjs.example.service..*.remove*(..))")  
  24.     public void writePointcut() {  
  25.     }  
  26.     @Before("readPointcut()")  
  27.     public void read() {  
  28.         DBContextHolder.slave();  
  29.     }  
  30.     @Before("writePointcut()")  
  31.     public void write() {  
  32.         DBContextHolder.master();  
  33.     }  
  34.     /**  
  35.      * 另一種寫法:if...else...  判斷哪些需要讀從數據庫,其余的走主數據庫  
  36.      */  
  37. //    @Before("execution(* com.cjs.example.service.impl.*.*(..))")  
  38. //    public void before(JoinPoint jp) {  
  39. //        String methodName = jp.getSignature().getName();  
  40. //  
  41. //        if (StringUtils.startsWithAny(methodName, "get", "select", "find")) {  
  42. //            DBContextHolder.slave();  
  43. //        }else {  
  44. //            DBContextHolder.master();  
  45. //        }  
  46. //    }  

有一般情況就有特殊情況,特殊情況是某些情況下我們需要強制讀主庫,針對這種情況,我們定義一個主鍵,用該注解標注的就讀主庫 

  1. package com.cjs.example.annotation;  
  2. public @interface Master { 

例如,假設我們有一張表member 

  1. package com.cjs.example.service.impl;  
  2. import com.cjs.example.annotation.Master;  
  3. import com.cjs.example.entity.Member;  
  4. import com.cjs.example.entity.MemberExample;  
  5. import com.cjs.example.mapper.MemberMapper;  
  6. import com.cjs.example.service.MemberService;  
  7. import org.springframework.beans.factory.annotation.Autowired;  
  8. import org.springframework.stereotype.Service;  
  9. import org.springframework.transaction.annotation.Transactional;  
  10. import java.util.List;  
  11. @Service  
  12. public class MemberServiceImpl implements MemberService { 
  13.     @Autowired  
  14.     private MemberMapper memberMapper;  
  15.     @Transactional  
  16.     @Override  
  17.     public int insert(Member member) {  
  18.         return memberMapper.insert(member);  
  19.     } 
  20.     @Master  
  21.     @Override  
  22.     public int save(Member member) {  
  23.         return memberMapper.insert(member);  
  24.     }  
  25.     @Override 
  26.     public List<Member> selectAll() {  
  27.         return memberMapper.selectByExample(new MemberExample());  
  28.     }  
  29.     @Master  
  30.     @Override  
  31.     public String getToken(String appId) {  
  32.         //  有些讀操作必須讀主數據庫  
  33.         //  比如,獲取微信access_token,因為高峰時期主從同步可能延遲  
  34.         //  這種情況下就必須強制從主數據讀  
  35.         return null;  
  36.     }  

4、測試 

  1. package com.cjs.example;  
  2. import com.cjs.example.entity.Member;  
  3. import com.cjs.example.service.MemberService;  
  4. import org.junit.Test;  
  5. import org.junit.runner.RunWith;  
  6. import org.springframework.beans.factory.annotation.Autowired;  
  7. import org.springframework.boot.test.context.SpringBootTest;  
  8. import org.springframework.test.context.junit4.SpringRunner;  
  9. @RunWith(SpringRunner.class)  
  10. @SpringBootTest  
  11. public class CjsDatasourceDemoApplicationTests {  
  12.     @Autowired  
  13.     private MemberService memberService;  
  14.     @Test  
  15.     public void testWrite() {  
  16.         Member member = new Member();  
  17.         member.setName("zhangsan");  
  18.         memberService.insert(member);  
  19.     }  
  20.     @Test  
  21.     public void testRead() {  
  22.         for (int i = 0; i < 4; i++) {  
  23.             memberService.selectAll();  
  24.         }  
  25.     }  
  26.     @Test  
  27.     public void testSave() {  
  28.         Member member = new Member();  
  29.         member.setName("wangwu");  
  30.         memberService.save(member);  
  31.     }  
  32.     @Test  
  33.     public void testReadFromMaster() {  
  34.         memberService.getToken("1234");  
  35.     }  

查看控制臺

5、工程結構

 

 

責任編輯:龐桂玉 來源: Java技術棧
相關推薦

2009-05-04 09:13:52

PHPMySQL讀寫分離

2021-06-25 10:05:58

SpringBootMySQL數據庫

2017-09-04 09:53:58

MySQLAtlasNavicat

2017-05-25 10:22:13

NoSQL數據庫主主備份

2011-08-30 09:59:47

Mysql ProxyLUA

2020-11-24 09:56:12

數據源讀寫分離

2020-04-23 15:08:41

SpringBootMyCatJava

2020-03-24 14:16:18

ProxySQLMySQL數據庫

2010-05-17 11:19:44

MySQL proxy

2022-04-25 08:03:57

MySQL中間件MyCat

2020-12-08 06:17:11

MycatMySQL分離

2011-08-30 12:49:59

Mysql ProxyLua分離

2024-01-22 08:46:37

MyBatis數據脫敏Spring

2023-12-13 12:20:36

SpringMySQL數據源

2024-07-31 09:56:20

2021-01-05 05:36:39

設計Spring Boot填充

2024-01-16 08:17:29

Mybatis驗證業務

2025-01-24 08:38:47

2019-05-13 15:00:14

MySQLMyCat數據庫

2019-09-30 09:19:54

Redis分離云數據庫
點贊
收藏

51CTO技術棧公眾號

国产区视频在线播放| 国产又粗又猛又黄视频| 黄色欧美网站| 色婷婷av久久久久久久| 亚洲综合成人婷婷小说| 国产91av视频| 日韩欧美精品一区| 精品国产乱码久久| 我看黄色一级片| 欧美xxxx性xxxxx高清| 久久久久久久久久美女| 91在线色戒在线| 久久久黄色大片| 天堂网av成人| 日韩午夜中文字幕| 九色porny91| 17videosex性欧美| 亚洲日本欧美天堂| 久久久福利视频| 国产黄色片免费观看| 六月婷婷一区| 国内精品中文字幕| 潘金莲一级黄色片| 久久99国内| 亚洲国产精品人久久电影| 草草久久久无码国产专区| www.在线视频| 国产精品女同一区二区三区| 久久99欧美| 丰满人妻熟女aⅴ一区| 国模一区二区三区白浆| 国产成人拍精品视频午夜网站| 中文字幕免费看| 国产精品115| 欧美一级高清片| 182午夜在线观看| 色8久久影院午夜场| 精品久久久久久国产| 91大学生片黄在线观看| 日韩av中文| 中文字幕在线不卡视频| 色综合666| 成年人在线观看| 日本一区二区三级电影在线观看| 亚洲精品免费在线视频| 亚洲天堂视频在线| 青青青伊人色综合久久| 国产精品极品美女在线观看免费 | 国产午夜亚洲精品一级在线| 欧美亚洲一区二区在线| 日韩av在线综合| av网站大全在线| 综合av第一页| 亚洲欧洲久久| 久操视频在线观看| 亚洲免费高清视频在线| 一区二区三区四区在线视频| 亚洲图片88| 国产精品第13页| 免费成人深夜夜行网站视频| 成人在线网址| 亚洲一卡二卡三卡四卡无卡久久 | a天堂在线观看视频| 精品一区二区三区的国产在线播放| 高清欧美性猛交xxxx| 欧美成人aaaaⅴ片在线看| 亚洲美女毛片| 日韩av成人在线观看| 中文字幕一区二区人妻视频| 男男视频亚洲欧美| 92福利视频午夜1000合集在线观看| av网站中文字幕| 精品成人国产| 欧美制服第一页| 日韩av黄色片| 日韩国产精品91| 成人免费网站在线| 黄色av一区二区三区| 91免费精品国自产拍在线不卡| 97av影视网在线观看| 粉嫩av一区二区夜夜嗨| 久久色在线观看| 亚洲精品一区二| 高h视频在线播放| 欧美午夜无遮挡| 911av视频| a看欧美黄色女同性恋| 国产午夜精品久久久| 欧美xxxooo| 激情六月综合| 国产精品亚洲第一区| www.久久色| 国产欧美一区二区三区网站 | 国产精品免费人成网站| 男人j进女人j| 国产不卡网站| 日韩精品一区二区三区四区 | 成人成人成人在线视频| 日韩高清专区| 超碰在线影院| 亚洲午夜一区二区三区| 亚洲欧美另类动漫| 国产精品白丝av嫩草影院| 国产性色av一区二区| 加勒比av在线播放| 老司机精品视频在线| 国产在线一区二区三区欧美| 午夜伦理在线| 欧美午夜无遮挡| 男男一级淫片免费播放| 美女网站色精品尤物极品姐弟| 亚洲福利视频二区| 小嫩苞一区二区三区| 亚洲欧美久久久| 99久久无色码| 亚欧在线观看视频| 亚洲激情在线播放| 天天视频天天爽| 蜜臀91精品国产高清在线观看| 亚洲性av网站| 色播视频在线播放| 国产精品69久久久久水密桃| 亚洲精品中文字幕乱码三区不卡| 高潮毛片在线观看| 欧美午夜一区二区三区免费大片| 国产wwwxx| 综合久久伊人| 在线日韩第一页| www.com国产| 不卡av免费在线观看| 日本福利一区二区三区| 999av小视频在线| 欧美精品一区二区高清在线观看| 免费看污片网站| 国产精品亚洲综合色区韩国| 国产美女在线精品免费观看| 欧美人与性动交α欧美精品济南到| 精品国产31久久久久久| 亚洲老女人av| 97久久综合区小说区图片区| 久久精品这里热有精品| 五月天综合激情网| 99精品视频在线观看| 国产精品999视频| 欧洲亚洲视频| 久久精品视频播放| 久久精品视频7| 久久久久久久网| 成人午夜视频免费在线观看| 亚洲专区视频| 国产精品第3页| www免费网站在线观看| 欧美日免费三级在线| 日韩一区二区三区四区视频| 久久精品72免费观看| 中文字幕av导航| 精品国产麻豆| 欧美精品videosex极品1| 天天天天天天天干| 国产精品狼人久久影院观看方式| 丝袜老师办公室里做好紧好爽| 国产激情综合| 欧美激情第99页| 五月婷婷开心中文字幕| 91久久免费观看| 青青青手机在线视频| 国产成人av一区二区| aa视频在线播放| 日韩激情欧美| 91国内在线视频| 成年人在线观看网站| 欧美精品久久天天躁| 国产一级片免费| 久久亚洲一区二区三区明星换脸| 久无码久无码av无码| 先锋影音国产精品| 国产日韩在线看片| 久久亚洲导航| 国产一区二区日韩精品欧美精品| 国产成人免费观看视频| 欧美国产成人在线| 中文字幕55页| 久久久久久久高潮| 欧美日韩一区二区三区在线视频 | 一级中文字幕一区二区| 亚洲av无码成人精品国产| 免费看黄色91| 日本精品久久久久久久久久| 日本精品在线观看| 欧美在线精品免播放器视频| av在线电影院| 日韩成人在线视频| 亚洲va在线观看| 亚洲欧美区自拍先锋| 午夜影院免费版| 亚洲欧美视频| 男人天堂网站在线| 秋霞欧美视频| 精品久久久久久一区二区里番| 综合日韩av| 色综合久久久888| 成人影视在线播放| 欧美日免费三级在线| 国产午夜视频在线播放| 91热门视频在线观看| 一级日本黄色片| 日本免费新一区视频| 国产中文字幕乱人伦在线观看| 五月综合久久| 99精品国产高清一区二区| 成人四虎影院| 欧美伊久线香蕉线新在线| 污污的视频在线观看| 日韩视频在线免费观看| 麻豆app在线观看| 亚洲精品一区二区三区蜜桃下载| 天天干天天干天天| 亚洲成人综合在线| 欧美日韩在线国产| 91亚洲永久精品| 男人插女人下面免费视频| 亚洲黄色高清| av日韩在线看| 自由日本语亚洲人高潮| 亚洲自拍的二区三区| 国产成人精品三级高清久久91| 国产一区香蕉久久| 九九九伊在线综合永久| 2019中文字幕在线| 国模精品视频| 最近中文字幕mv在线一区二区三区四区 | 深夜视频在线观看| 极品美女销魂一区二区三区| 男女无套免费视频网站动漫| 久久在线精品| 国产精品69页| 黄色成人在线网址| 香港三级日本三级a视频| 一个色综合网| 国产午夜精品视频一区二区三区| 外国成人在线视频| 91手机在线播放| 精品一区二区三区四区五区| 成人福利在线观看| 国产一区二区三区视频在线 | 国产成人免费精品| 国产精品一区=区| 欧美在线一级| 亚洲一区二区三区xxx视频| 国产精品99久久免费| 亚洲综合在线播放| 1204国产成人精品视频| 国产有码一区二区| 日本一区二区三区播放| 国产精品日韩一区二区三区| 久久婷婷国产| 日本精品国语自产拍在线观看| 国内精品偷拍| 免费中文日韩| 久久精品国产www456c0m| 中文字幕在线中文字幕日亚韩一区| 在线视频亚洲专区| 亚洲一区二区三区加勒比 | 制服丝袜亚洲播放| 国产成人三级一区二区在线观看一| 在线日韩国产精品| 91久久久久国产一区二区| 欧美成人一区二区| 亚洲欧洲成人在线| 中文字幕无线精品亚洲乱码一区 | 高潮精品一区videoshd| 爱爱爱爱免费视频| 日本va欧美va欧美va精品| 第一区免费在线观看| 成人午夜av影视| 日本精品在线观看视频| 日韩久久一区二区| 激情五月色婷婷| 欧美三级电影在线观看| 亚洲精品无码久久久| 欧美一级在线视频| 国产精品久久久久久久一区二区| 欧美日韩一区不卡| 中日韩av在线| 精品国产制服丝袜高跟| 久青青在线观看视频国产| 久久手机精品视频| 日本在线啊啊| 亚洲mm色国产网站| 日韩中文字幕| 欧洲亚洲一区| 精品日本12videosex| 日韩精品不卡| 日韩极品一区| 亚洲中文字幕无码中文字| 久久99国产乱子伦精品免费| 韩国无码一区二区三区精品| 亚洲欧洲成人自拍| av网站中文字幕| 精品国产乱码久久久久久影片| 狠狠躁日日躁夜夜躁av| 中文字幕av一区二区| 久久亚洲天堂| 国产不卡视频在线| 久草在线综合| 久久久久福利视频| 麻豆久久久久久久| 性欧美成人播放77777| 一区二区三区欧美在线观看| 中文字幕乱码视频| 日韩电影中文字幕一区| 色呦呦网站在线观看| 国产精品日韩欧美综合| 亚洲大片精品免费| av网站大全免费| 国产一区二区免费视频| gv天堂gv无码男同在线观看| 精品国产精品自拍| 亚洲视频久久久| 亚洲人成亚洲人成在线观看| 草美女在线观看| 99久热re在线精品996热视频| 久久丝袜视频| 分分操这里只有精品| 成人国产在线观看| 国产伦精品一区二区三区视频女| 中文字幕在线不卡一区二区三区| 欧美激情一区二区视频| 8x8x8国产精品| 亚洲人午夜射精精品日韩| 久久久人成影片一区二区三区观看| 成人性生活视频| 91九色国产社区在线观看| 日韩精品首页| 亚洲精品视频导航| 99视频一区二区三区| 国产亚洲欧美久久久久| 欧美三片在线视频观看| 国产女主播在线写真| 国产精品成人久久久久| 宅男在线一区| 亚洲黄色a v| 国产精品色一区二区三区| 中文字字幕在线观看| 亚洲成人黄色在线观看| 黑人极品ⅴideos精品欧美棵| 国产精品第10页| 菠萝蜜一区二区| 国产原创精品在线| 亚洲视频图片小说| www.爱爱.com| 国色天香2019中文字幕在线观看| 日韩伦理一区二区| 亚洲一区精品视频| 国产一区二区免费视频| xxxx 国产| 国产丝袜一区二区| 成人性片免费| 欧美大片免费播放| 99久久精品一区二区| 中文字幕69页| 中文字幕在线国产精品| 电影一区二区三区久久免费观看| 日本一区网站| 国产综合久久久久久久久久久久| 国产真人做爰视频免费| 欧美日韩国产123区| 欧美女同一区| 欧美在线日韩精品| 久久99精品一区二区三区 | 国产调教精品| 日本黄色三级大片| 中文字幕一区日韩精品欧美| av在线资源观看| 91高潮在线观看| 久久精品高清| 波多野结衣一二三区| 日本丶国产丶欧美色综合| 国产理论在线观看| 久久久精品国产一区二区三区| 激情视频一区| 亚洲av成人无码久久精品| 欧美一区二区三区免费观看视频| 免费的黄网站在线观看| 国产精品一区在线播放| 日本欧美一区二区| 国产在线综合视频| 日韩欧美国产三级| 一区在线影院| 亚洲国产精品成人天堂| 日本一区二区成人| 蜜桃av中文字幕| 国产一区在线播放| 午夜在线一区二区| 日韩欧美国产成人精品免费| 日韩av一区在线| 久久爱www.| caoporn超碰97| 黄色91在线观看| 伊人222成人综合网|