国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

Spring Boot + MyBatis + MySQL 實(shí)現(xiàn)讀寫分離!

共 588字,需瀏覽 2分鐘

 ·

2021-09-17 09:03

上一篇:深夜看了張一鳴的微博,讓我越想越后怕

作者:廢物大師兄
來源:https://www.cnblogs.com/cjsblog/p/9712457.html

1、引言

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

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

然而,應(yīng)用程序?qū)用嫒プ鲎x寫分離最大的弱點(diǎn)(不足之處)在于無法動(dòng)態(tài)增加數(shù)據(jù)庫節(jié)點(diǎn),因?yàn)閿?shù)據(jù)源配置都是寫在配置中的,新增數(shù)據(jù)庫意味著新加一個(gè)數(shù)據(jù)源,必然改配置,并重啟應(yīng)用。當(dāng)然,好處就是相對(duì)簡單。

2、AbstractRoutingDataSource

基于特定的查找key路由到特定的數(shù)據(jù)源。它內(nèi)部維護(hù)了一組目標(biāo)數(shù)據(jù)源,并且做了路由key與目標(biāo)數(shù)據(jù)源之間的映射,提供基于key查找數(shù)據(jù)源的方法。


3、實(shí)踐

3.1. maven依賴

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.cjs.example</groupId>
    <artifactId>cjs-datasource-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>cjs-datasource-demo</name>
    <description></description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.8</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>


            <!--<plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.5</version>
                <dependencies>
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>5.1.46</version>
                    </dependency>
                </dependencies>
                <configuration>
                    <configurationFile>${basedir}/src/main/resources/myBatisGeneratorConfig.xml</configurationFile>
                    <overwrite>true</overwrite>
                </configuration>
                <executions>
                    <execution>
                        <id>Generate MyBatis Artifacts</id>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>-->

        </plugins>
    </build>
</project>

3.2. 數(shù)據(jù)源配置

application.yml

spring:
  datasource:
    master:
      jdbc-url: jdbc:mysql://192.168.102.31:3306/test
      username: root
      password: 123456
      driver-class-name: com.mysql.jdbc.Driver
    slave1:
      jdbc-url: jdbc:mysql://192.168.102.56:3306/test
      username: pig   # 只讀賬戶
      password: 123456
      driver-class-name: com.mysql.jdbc.Driver
    slave2:
      jdbc-url: jdbc:mysql://192.168.102.36:3306/test
      username: pig   # 只讀賬戶
      password: 123456
      driver-class-name: com.mysql.jdbc.Driver

多數(shù)據(jù)源配置

package com.cjs.example.config;

import com.cjs.example.bean.MyRoutingDataSource;
import com.cjs.example.enums.DBTypeEnum;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

/**
 * 關(guān)于數(shù)據(jù)源配置,參考SpringBoot官方文檔第79章《Data Access》
 * 79. Data Access
 * 79.1 Configure a Custom DataSource
 * 79.2 Configure Two DataSources
 */

@Configuration
public class DataSourceConfig {

    @Bean
    @ConfigurationProperties("spring.datasource.master")
    public DataSource masterDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    @ConfigurationProperties("spring.datasource.slave1")
    public DataSource slave1DataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    @ConfigurationProperties("spring.datasource.slave2")
    public DataSource slave2DataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    public DataSource myRoutingDataSource(@Qualifier("masterDataSource") DataSource masterDataSource,
                                          @Qualifier("slave1DataSource") DataSource slave1DataSource,
                                          @Qualifier("slave2DataSource") DataSource slave2DataSource) {
        Map<Object, Object> targetDataSources = new HashMap<>();
        targetDataSources.put(DBTypeEnum.MASTER, masterDataSource);
        targetDataSources.put(DBTypeEnum.SLAVE1, slave1DataSource);
        targetDataSources.put(DBTypeEnum.SLAVE2, slave2DataSource);
        MyRoutingDataSource myRoutingDataSource = new MyRoutingDataSource();
        myRoutingDataSource.setDefaultTargetDataSource(masterDataSource);
        myRoutingDataSource.setTargetDataSources(targetDataSources);
        return myRoutingDataSource;
    }

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

MyBatis配置

package com.cjs.example.config;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.annotation.Resource;
import javax.sql.DataSource;

@EnableTransactionManagement
@Configuration
public class MyBatisConfig {

    @Resource(name = "myRoutingDataSource")
    private DataSource myRoutingDataSource;

    @Bean
    public SqlSessionFactory sqlSessionFactory() throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(myRoutingDataSource);
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
        return sqlSessionFactoryBean.getObject();
    }

    @Bean
    public PlatformTransactionManager platformTransactionManager() {
        return new DataSourceTransactionManager(myRoutingDataSource);
    }
}
由于Spring容器中現(xiàn)在有4個(gè)數(shù)據(jù)源,所以我們需要為事務(wù)管理器和MyBatis手動(dòng)指定一個(gè)明確的數(shù)據(jù)源。另外,Spring 系列面試題和答案全部整理好了,微信搜索互聯(lián)網(wǎng)架構(gòu)師,在后臺(tái)發(fā)送:2T,可以在線閱讀。

3.3. 設(shè)置路由key / 查找數(shù)據(jù)源

目標(biāo)數(shù)據(jù)源就是那前3個(gè)這個(gè)我們是知道的,但是使用的時(shí)候是如果查找數(shù)據(jù)源的呢?

首先,我們定義一個(gè)枚舉來代表這三個(gè)數(shù)據(jù)源

package com.cjs.example.enums;

public enum DBTypeEnum {

    MASTER, SLAVE1, SLAVE2;

}

接下來,通過ThreadLocal將數(shù)據(jù)源設(shè)置到每個(gè)線程上下文中

package com.cjs.example.bean;

import com.cjs.example.enums.DBTypeEnum;

import java.util.concurrent.atomic.AtomicInteger;

public class DBContextHolder {

    private static final ThreadLocal<DBTypeEnum> contextHolder = new ThreadLocal<>();

    private static final AtomicInteger counter = new AtomicInteger(-1);

    public static void set(DBTypeEnum dbType) {
        contextHolder.set(dbType);
    }

    public static DBTypeEnum get() {
        return contextHolder.get();
    }

    public static void master() {
        set(DBTypeEnum.MASTER);
        System.out.println("切換到master");
    }

    public static void slave() {
        //  輪詢
        int index = counter.getAndIncrement() % 2;
        if (counter.get() > 9999) {
            counter.set(-1);
        }
        if (index == 0) {
            set(DBTypeEnum.SLAVE1);
            System.out.println("切換到slave1");
        }else {
            set(DBTypeEnum.SLAVE2);
            System.out.println("切換到slave2");
        }
    }

}
獲取路由key
package com.cjs.example.bean;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
import org.springframework.lang.Nullable;

public class MyRoutingDataSource extends AbstractRoutingDataSource {
    @Nullable
    @Override
    protected Object determineCurrentLookupKey() {
        return DBContextHolder.get();
    }

}
設(shè)置路由key

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

package com.cjs.example.aop;

import com.cjs.example.bean.DBContextHolder;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class DataSourceAop {

    @Pointcut("!@annotation(com.cjs.example.annotation.Master) " +
            "&& (execution(* com.cjs.example.service..*.select*(..)) " +
            "|| execution(* com.cjs.example.service..*.get*(..)))")
    public void readPointcut() {

    }

    @Pointcut("@annotation(com.cjs.example.annotation.Master) " +
            "|| execution(* com.cjs.example.service..*.insert*(..)) " +
            "|| execution(* com.cjs.example.service..*.add*(..)) " +
            "|| execution(* com.cjs.example.service..*.update*(..)) " +
            "|| execution(* com.cjs.example.service..*.edit*(..)) " +
            "|| execution(* com.cjs.example.service..*.delete*(..)) " +
            "|| execution(* com.cjs.example.service..*.remove*(..))")
    public void writePointcut() {

    }

    @Before("readPointcut()")
    public void read() {
        DBContextHolder.slave();
    }

    @Before("writePointcut()")
    public void write() {
        DBContextHolder.master();
    }


    /**
     * 另一種寫法:if...else...  判斷哪些需要讀從數(shù)據(jù)庫,其余的走主數(shù)據(jù)庫
     */
//    @Before("execution(* com.cjs.example.service.impl.*.*(..))")
//    public void before(JoinPoint jp) {
//        String methodName = jp.getSignature().getName();
//
//        if (StringUtils.startsWithAny(methodName, "get""select""find")) {
//            DBContextHolder.slave();
//        }else {
//            DBContextHolder.master();
//        }
//    }
}

有一般情況就有特殊情況,特殊情況是某些情況下我們需要強(qiáng)制讀主庫,針對(duì)這種情況,我們定義一個(gè)主鍵,用該注解標(biāo)注的就讀主庫

package com.cjs.example.annotation;

public @interface Master {
}

例如,假設(shè)我們有一張表member

package com.cjs.example.service.impl;

import com.cjs.example.annotation.Master;
import com.cjs.example.entity.Member;
import com.cjs.example.entity.MemberExample;
import com.cjs.example.mapper.MemberMapper;
import com.cjs.example.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
public class MemberServiceImpl implements MemberService {

    @Autowired
    private MemberMapper memberMapper;

    @Transactional
    @Override
    public int insert(Member member) {
        return memberMapper.insert(member);
    }

    @Master
    @Override
    public int save(Member member) {
        return memberMapper.insert(member);
    }

    @Override
    public List<Member> selectAll() {
        return memberMapper.selectByExample(new MemberExample());
    }

    @Master
    @Override
    public String getToken(String appId) {
        //  有些讀操作必須讀主數(shù)據(jù)庫
        //  比如,獲取微信access_token,因?yàn)楦叻鍟r(shí)期主從同步可能延遲
        //  這種情況下就必須強(qiáng)制從主數(shù)據(jù)讀
        return null;
    }
}


4、測(cè)試

package com.cjs.example;

import com.cjs.example.entity.Member;
import com.cjs.example.service.MemberService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class CjsDatasourceDemoApplicationTests {

    @Autowired
    private MemberService memberService;

    @Test
    public void testWrite() {
        Member member = new Member();
        member.setName("zhangsan");
        memberService.insert(member);
    }

    @Test
    public void testRead() {
        for (int i = 0; i < 4; i++) {
            memberService.selectAll();
        }
    }

    @Test
    public void testSave() {
        Member member = new Member();
        member.setName("wangwu");
        memberService.save(member);
    }

    @Test
    public void testReadFromMaster() {
        memberService.getToken("1234");
    }

}

查看控制臺(tái)




5、工程結(jié)構(gòu)

另外,關(guān)注公眾號(hào)互聯(lián)網(wǎng)架構(gòu)師,在后臺(tái)回復(fù):面試,可以獲取我整理的 Java、Spring 系列面試題和答案,非常齊全。

參考:

https://www.jianshu.com/p/f2f4256a2310
http://www.cnblogs.com/gl-developer/p/6170423.html
https://www.cnblogs.com/huangjuncong/p/8576935.html
https://blog.csdn.net/liu976180578/article/details/77684583

感謝您的閱讀,也歡迎您發(fā)表關(guān)于這篇文章的任何建議,關(guān)注我,技術(shù)不迷茫!小編到你上高速。
    · END ·
最后,關(guān)注公眾號(hào)互聯(lián)網(wǎng)架構(gòu)師,在后臺(tái)回復(fù):2T,可以獲取我整理的 Java 系列面試題和答案,非常齊全。


正文結(jié)束


推薦閱讀 ↓↓↓

1.不認(rèn)命,從10年流水線工人,到谷歌上班的程序媛,一位湖南妹子的勵(lì)志故事

2.如何才能成為優(yōu)秀的架構(gòu)師?

3.從零開始搭建創(chuàng)業(yè)公司后臺(tái)技術(shù)棧

4.程序員一般可以從什么平臺(tái)接私活?

5.37歲程序員被裁,120天沒找到工作,無奈去小公司,結(jié)果懵了...

6.IntelliJ IDEA 2019.3 首個(gè)最新訪問版本發(fā)布,新特性搶先看

7.這封“領(lǐng)導(dǎo)痛批95后下屬”的郵件,句句扎心!

8.15張圖看懂瞎忙和高效的區(qū)別!

一個(gè)人學(xué)習(xí)、工作很迷茫?


點(diǎn)擊「閱讀原文」加入我們的小圈子!

瀏覽 26
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評(píng)論
圖片
表情
推薦
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 日韩一级在线视频| 成人做爰黄A片免费| 欧美黄色三级视频| 国产91精品看黄网站在线观看| 在线少妇| 天天爱天天操| 日韩精品无码一区二区三区| 俺来俺也去www色在线观看| 亚洲成人在线免费| 精品在线一区| 久久久黄片| 亚洲福利女神成人福利| 日韩一区二区三免费高清在线观看| 日本免费黄色小视频| 台湾精品无码| 久久免费黄色| 波多野结衣AV在线观看| 蜜桃传媒在线| 国产91www| 国产一区二区三区在线观看免费视频免费视频免费视频 | 欧美1区| 天天躁狠狠躁夜躁2024| 亚洲精品女人| 国产一区二区三区免费播放| 免费无码一区二区三区四区五区| 2016超碰| 淫色网址| 伊人成人大香蕉| 中文字幕久久无码| 宗合久久| 日韩一区二区三区视频| 欧洲三级片| 人妻无码HEYZO少妇精品| 77777精品成人免费A片| 伊人网视频在线播放| 中文字幕久热| 日韩美毛片| 搡BBBB搡BBB搡五十粉嫩 | 亚洲男同Gay一区二区| 婷婷狠狠| 天堂素人| 欧美18禁| 国产熟女一区| 国产网站在线| 国产精品后入| 日韩一区二区三区无码电影| 欧美高潮喷水| AV黄片| 超碰99热| 国产香蕉视屏| 国产午夜精品一区二区三区嫩A| 亚洲精品资源在线| 中文字幕第6页| 亚洲欧美日韩黑料吃瓜在线观看 | 欧美欧美欧美| 自慰喷水在线观看| 一级黄色录像带| 亚洲AV免费在线观看| 337P大胆粉嫩噜噜噜| 色婷婷狠| A片免费在线播放| 国产福利视频在线观看| 久艹在线视频| 91秦先生在线播放| 国产理论| 欧美内射在线| 91视频在线免费观看| 91.xxxx| av无码免费在线观看| 国产jk在线观看| 国产无码一二三区| 无码人妻一区二区三区在线视频不卡| 91小仙女jK白丝袜呻吟| 嫩草久久99www亚洲红桃 | Av毛片| 国产精品天天AVJ精麻传媒| 江苏妇搡BBBB搡BBBB-百度| 中文字幕免费在线播放| 亚洲福利影院| 91丨九色丨老熟女探花| 日韩中文字幕AV| 成人福利免费视频| 操东北女人逼| 精品无码三级在线观看视频| 91精品久久久久久| 91丨豆花丨国产极品| 在线激情网站| 日韩操逼片| 日韩性爱网| 一级片操逼| 欧美一级性爱视频| 午夜精品久久久久久久久久久久 | 强伦轩农村人妻| 亚洲视频在线观| 51妺嘿嘿午夜福利在线| 无码精品人妻一区二区三区漫画| 精品午夜福利| 欧美日屄视频| 88AV在线播放| 草逼美女| 逼特逼视频| 偷拍亚洲综合| 国产无码操逼| 操逼视频大全| 国产乱码精品一品二品| 日韩福利在线| 精品秘一区性综合三区| 91精品国产综合久久蜜臀使用方法 | AAAAA毛片| 精品无码久久久久久久久app| 高清无码第一页| 色婷婷视频在线观看| 无码中文一区| 大香蕉伊人在线观看| 中文字幕+乱码+中文字幕一区| 亚洲春色一区二区三区| 亚洲成人网站视频| 亚洲天堂AV网| 欧美熟妇性爱视频| 午夜成人视频在线观看| 欧美激情婷婷| 人人爽人人爱| 人人人人摸| 豆花视频成人精品视频| 在线看污| 性爱视频免费网站| 在线视频内射| 插进去综合网| 91在线成人| 人人干人人操人人爱| 五月丁香亭亭| 国产精品久久久久的角色| 国产操美女| 影音先锋AV成人| 午夜成人小电影| 91AV在线观看视频| www.偷拍| 国产成人无码一区二区在线观看 | 无码人妻精品一区二区50| 天天澡天天爽日日AV| 91成人视频在线免费观看| 漂亮人妻吃鸡啪啪哥哥真的好| 大奶无码| 欧美日韩操逼片| 美女日屄| 欧美韩日一区二区| 亚洲无码在| 国产无码三级| 在线免费亚洲视频| 亚洲高清视频在线观看| 亚洲欧洲在线视频| 婷婷五月天无码| 色综合久久久无码中文字幕999| 免费一级婬片AAA片毛片A级| 99精品久久久久久无码| 大香蕉色视频| www久久| 懂色av懂色av粉嫩av无码| 大香蕉视频国产| 2024国产精品| 中文字幕免费在线看一区七区| 日本AⅤ中文字幕| 成人性爱在线观看| 精品www| 日韩在线高清视频| 狠狠干狠狠草| 一区二区入口| 免费无码国产在线怀| 久久蜜桃| 2021天天操| 国产精品嫩草久久久久yw193| 欧美成人大香蕉| 欧美日韩网| 俺来也操逼| 国内免费AV| 欧美成人精品三级网站| 粉嫩AV蜜乳AV蜜臀AV蜂腰AV| 青青草免费观看视频| 黄色片在线视频| 俺去俺来也www色视频| 国产豆花视频| 大地资源中文第二页导读内容 | 嫩BBB槡BBBB槡BBBB免费视频 | 亚洲最大福利视频| 国产无码久久久| 波多野结衣黄色视频| 精品欧美乱码久久久久久| 亚洲第一黄| 日韩在线观看免费| 人人操人人撸| 福利逼站| 4388亚洲最大| 精品一区二区三区蜜桃臀www| 一级黄色视频在线观看| 伊人综合大香蕉| 成人久久久久久| 中日韩一级片| 中文字幕第五页| 影音先锋麻豆传媒| 日本免费黄| 亚洲AV无码秘翔田| 亚洲精品乱码久久久久久久| 日韩无码高清网站| 免费无码高清| 亚洲精品成人无码毛片| 91干逼| 91网站观看| 一区无码| 成人性爱在线视频| 熟妇槡BBBB槡BBBB图| 性性性性性XXXXX| 初学影院WWWBD英语完整版在线观看| 亚州精品人妻一二三区| 亚洲av毛片| 97人妻精品一区二区三区免 | 免费无码国产在线怀| 伊人大香蕉网| 国产免费视频69| 日韩中文字幕在线| 免费成人黄片| 九九福利视频| 欧美精品在线观看视频| 7x7x7x人成免费观学生视频| 国产一毛a一毛a在线观看| 夜夜撸视频| 水蜜桃网址| 五月天婷婷基地| 国内久久婷婷| 亚洲AV成人无码一区二区三区| 人妻丝袜蕾丝高跟双飞| 国产精品成人国产乱| 亚洲一区无码| 乱子伦国产精品| 无码少妇视频| 乖我硬了让老子cao你小视频| 欧美日韩精品一区二区三区视频播放 | 国产丨熟女丨国产熟女视频| 日韩欧美成人视频| 中文字幕高清无码视频| 亚洲色婷婷五月天| 日韩蜜桃视频| 美国高清无码| 尹人香蕉久久| 翔田千里无码| 国产精品视频久久| 中文字幕第5页| 亚洲免费黄色| 天天爽天天射| 国产精品夜夜爽7777777| 欧美操逼网址| 蜜臀久久99精品久久久久酒店更新时间 | 日韩a级片| 五月天乱伦小说| www.中文无码| 日韩一级毛| 欧美午夜性爱视频| 国语偷拍| 麻豆国产91| 无码在线视频播放| 日韩bbbb| 亚洲色男人天堂| 国产91小视频| 日韩极品视频在线| 国产一毛a一毛a在线观看| 国产18女人水真多免费看| 欧美成人视频电影无码高清| 亚洲欧美成人| 黄片视频免费看| 大香蕉伊人久久| 黑人一级片| 东京热综合| 露脸丨91丨九色露脸| 日韩人妻精品无码久久| 中国老女人操逼| www.sese| 久草99| www.狠狠操| 蜜柚av| 成人片成人片| 91激情在线| 甘肃WBBBB搡wBBBB| 三级成人网站| 久久午夜无码鲁片午夜精品男男| 五月色婷婷撸| 亚洲性夜夜天天天天天天| 色综合视频| 亚洲激情小说| 尤物在线视频| 爱精品视频| 亚洲无吗在线视频| 69av视频在线观看| 国产福利免费视频| 蝌蚪窝在线视频观看| 人妻操逼视频| 亚洲午夜福利视频在线观看| 美女高潮网站| 午夜福利电影AV| 在线观看免费视频黄| 91激情网| 爱爱成人视频| 日本人人操| 亚洲影音先锋| 免费av网站| 败火老熟女ThePorn视频| 岛国av无码免费| 91三级片在线播放| 日韩欧美人妻无码精品| 亚洲天堂无码AV| 午夜福利成人网站| 在线观看视频免费无码免费视频 | 亚洲AV无码成人H动漫| 一级大香蕉| 草草浮力院| 加勒比无码在线播放| 老司机av| 国产视频久久久| 日韩成人无码全裸视频| 北条麻妃精品青青久久价格| 中文字幕+乱码+中文字幕一区| 黄色A级视频| 久久私拍| 黄色影片在线观看| 亚洲日韩AV在线| 大鸡吧成人视频| 黄频在线免费观看| yjizz视频网| 日韩香蕉视频| 婷婷五月天网址| 国产一区不卡| 亚洲免费在线婷婷| 91色色影院| 91成人久久| 亚洲色图另类| 日本黄色免费| 狠狠干高清成人二区三区| 欧美性爱无码在线| 亚洲在线观看中文字幕| 黄色国产AV| 亚洲无码在线免费观看视频| 激情无码视频| www国产| 激情小说在线视频| 丰满岳乱妇一区二区三区全文阅读| 思思热99| 欧美经典自拍狼友| 一级片在线免费看| 日韩精品免费在线观看| 熟女三区| 国产一级美女操逼视频免费播放| 午夜激情操一操| 性九九九九九九| 麻豆国产精品| adn日韩av| 亚洲国产中文字幕在线播放| 色色网五月天| 翔田千里AV在线| 黄色无無| 91视频在线观看免费大全| 精品国产午夜福利在线观看| 丰满的人妻一区二区三区果冻 | 97操碰| 中文字幕日韩无码电影| 色播欧美| AV中文字幕网| 啪啪啪免费网站| 欧美熟女一区| 亚州视频在线| 五月激情丁香| 黑人AV在线播放| 国产黄色视频免费在线观看| 大香蕉网伊| 日韩A| 天堂网资源| 欧美偷拍精品| 亚洲AV无码乱码| 欧美日韩一级二级三级| 中文字幕你懂的| 伊人激情网| 青娱乐一级无码| www四虎| 91日韩在线| 黄色国产视频在线观看| AV天堂无码| 国产男女性爱视频播放| 亚洲中文免费观看| 免费大黄网站| 中文无码av| 中文字幕亚洲人妻| 在线免费看黄色视频| 日韩AAA| 高清无码一级片| 亚洲小视频在线| 北条麻妃一区二区三区在线| 国产操逼小视频| 九九偷拍视频| 人妻黄色| 人人妻人人爱人人操| 日韩免费在线观看一区入口| 久久精品在线播放| 精品无码一区二区三| 国产精品做爱| 无码不卡在线观看| AV天堂影视在线观看| 日韩欧美一区在线| 亚洲精品AⅤ一区二| 欧美老妇BBBBBBBBB| 欧美又大又粗| 亚洲国产剧情| 中国黄色学生妹一级片| 女生自慰在线观看| 久久在线| 久久精品视频在线观看| 91无码人妻精品一区二区三区四| 一级在线| 久久婷婷无码视频| 欧美成人精品激情在线视频| 免费看一级高潮毛片| 黑人巨粗进入疼哭A片| 欧美一级片| 免费看黄色的网站| 西西人体大胆ww4444| 中文字幕AV免费观看| av婷婷在线| 专肏老妇人大逼| 亚洲AV无码| 亚欧洲精品视频| 精品国产精品| 91在线看18| 久久成人小电影| 成人亚洲性情网站www在线| 91免费在线看| 国产激情内射| 91资源在线观看| 成人毛片一区二区三区| 欧美大香蕉在线视频| 欧美午夜精品久久久久免费视| 337p大胆色噜噜噜噜噜| 免费av毛片| 3344在线观看免费下载视频 | 中文字幕无码在线视频| 在线观看亚洲中文字幕| 日韩无码久久久| 久久无码在线观看| 精品久久国产| anwuye官方网站| 亚洲vs天堂vs成人vs无码| 亲子伦视频一区二区三区| 亚洲国产精品成人va在线观看| 无码秘人妻一区二区三-百度| 亚洲国际中文字幕在线| 丰满岳乱妇一区二区三区| 有免费的欧美操逼视频吗| 日韩有码第一页| 国产精品在线免费| 麻豆人妻换人妻好紧| 人人舔人人草| www.男人的天堂| 污污污污污www网站免费观看| 永久免费看A人片无码精| 老湿机福利视频| 蜜桃无码视频小说网站| 成人做爰A片一区二区app| 国产亚洲欧美视频| 胖老板办公室沙发无套爆秘书| 亚洲视频高清无码| 午夜免费福利视频| 日本色色视频| 青春草在线免费视频| 免费中文字幕视频| 91欧美在线| 欧美另类极品| 欧美黄色电影网站| 免费三级毛片| 亚洲伊人在线| 嫩草国产| 国产l精品久久久久久久久久| 亚洲调教| 一道本无码视频| 日韩在线观看| 思思操| 波多野结衣无码一区| 日韩aaa| 人成视频在线免费观看| 丁香婷婷五月基地| 免费看日韩视频| 久操无码| 豆花成人视频在线观看| 亚洲青草视频| 精品偷拍视频| 久久午夜无码鲁丝片主演是谁 | 91在线无码精品秘国产色多多| 欧美激情三区| 欧美精品三区| 天天爽夜夜爽夜夜爽精品视频| 国产AV黄片| 91大奶熟女| 天天干夜夜操熟女| 日韩免费高清视频| 久久私拍| 男女一区二区三区| 春色Av| 久久久久无码精品亚洲日韩| 黄色a级片| 国产日韩欧美成人| 操逼天堂| 欧美浮力| 亚洲激情图| 成年人免费视频在线观看| 欧美性爱中文字幕| 久久久久久三级电影| 女人的天堂av| 青草视频在线免费观看| 欧美三级网址| 国产人妻精品一区二区三区不卡| 欧美做爱网站| 一级无码高清| 欧美黄色精品| 国产无码一二三区| 最近中文字幕2022在线观看A| 18禁网址| 欧美群交在线| 天天干天| 操人视频网站| 欧美一级成人片| 无码中文字幕高清| 少妇无码视频| 在线免费观看一区| 亚洲成人视频在线免费观看| 中文人妻无码| 成人无码欧美大片免费看| 午夜毛片| 亚洲永久| 亚洲免费网| 欧美网站在线观看| 老太色HD色老太HD-百度 | 黄网国产手机在线观看| 中文字幕无码视频| 爱爱91| 黄片免费视频在线观看| 黄色视频在线观看免费网站 | 中文字幕乱码亚洲无线码在线日噜噜 | 麻豆成人91精品二区三区| 18一20女一片毛片| 国产综合在线播放| 国产乱仑视频| 狠狠狠狠狠狠干| 亚洲内射无码| 激情五月色五月| 91视频导航| 色色激情视频| 成人在线免费观看视频| 无码123| 一级特黄AAAA片| 婷婷在线电影| 久久视频一区| 亚洲色综合久久五月| 亚洲精品成人无码AV在线| 国产无码高清在线观看| 亚洲四房播| 在线观看亚州| 88av在线观看| 鲁一鲁视频| 风情万种AV| 青青草原av| 日韩AV免费| 玩弄人妻少妇500系列视频| 亚洲性爱av| 精品无码免费| 中文字幕国产精品| 色片在线| 亚洲无码成人在线观看| 成人毛片100免费观看| 最近中文字幕在线中文字幕7| 无码精品一区二区在线| 一本无码中文字幕| 久久婷婷国产麻豆91天堂| 91大神在线看| 成人视频18+在线观看| 欧美日韩一级毛| 北条麻妃在线一区二区| 中文字幕第一页av| 青青草原在线视频免费观看| 好吊妞在线观看| 大香蕉青娱乐| 亚洲男同Gay一区二区| 逼逼AV| 日韩欧美在线免费| 蜜桃Av噜噜| 国产成人无码精免费视频| 爱爱视频天天操| 亚洲无码中文视频| 亚洲日韩精品无码| 国产一级片免费| 天天爽日日澡| 久久播视频| 99精品色| 囯产精品久久久久久久| 日韩性爱视频网站| 最近2021中文字幕免费| 91大鸡巴| 精品国产91乱码一区二区三区| 欧美精产国品一二三| 久久性视频| 欧美成人伦理片网| 国内自拍激情视频| 欧美性猛交XXXX乱大交| 国产一区视频18| 性爱xxxxx| 日韩无码人妻一区| 国内视频一区| 亚洲欧美视频一区| 中文字幕无码日韩| 国产看片网站| 亚洲色图在线视频| 黄色三级视频在线观看| 精品无码国产一区二区三区51安| 大香蕉伊人在线手机网| 婬乱欧美一二三区| 少妇AAA级久久久无码精品片 | 永久免费黄色视频| av网站免费观看| 91超碰在线免费观看| 69成人网| 国产激情欧洲在线观看一区二区三区| 五月丁香六月久久| 人成视频免费观看| 日韩精品视频免费在线观看| 午夜精品人妻无码| 91精品无码视频| 囯产精品久久久久久久| 国产一级a爱做片免费☆观看| 国产视频导航| 干欧美美女| 51嘿嘿嘿国产精品伦理| 中文字幕亚洲天堂| 波多野结衣久久中文字幕| 东京热在线免费观看| 乱婬妺妺躁爽A片| 久久午夜无码鲁丝片午夜精品偷窥 | 最新国产av| A视频免费| 中文字幕AV第一页| 草逼国产| 免费一级黄色| 国内成人自拍| 色情一级AA片免费观看| 人妻无码精品| 国产中文字幕在线免费观看| 欧美一级网| 在线中文字幕亚洲| 精品国产91乱码一区二区三区| 无码四区| 亚洲精品视频在线观看免费 | 久久91久久久久麻豆精品| 理论片无码| 97色在线| 蜜桃黄片AV在线观看| jizz日本护士| 无码人妻精品一区二区蜜桃漫画| 国产四区| 91小电影| 91色色影院| 人人爱人人摸人人操| 久久悠悠| 2014亚洲天堂| 免费黄色av网址| 微熟女地址导航| 成人精品免费视频| 影音先锋色站| 日本aaaa片| 国产三级片在线观看视频| 欧美熟妇精品一二三区| 走光无码一区二区三区| 久草在线播放| 高清无码视频免费观看| 德国肥妇熟妇BBwBBw| 俺去俺来也在线www色情网| 777免费视频| 婷婷在线观看免费| 亚洲成人二区| 色综合久久88色综合天天| 亚洲性生活| 欧美特黄一级视频| 男男做受A片AAAA| 欧美午夜精品一区二区蜜桃| 国产又爽又黄视频在线看| 亚洲性爱一区二区| 久久天堂| 国产激情无码免费| 一道本无码在线| 99这里只有精品| 国产丰满乱子伦无码| 91成人在线视频| 熟女AV888| av资源在线播放| 天天夜夜久久| 亚洲精品国产成人综合久久久久久久久| 欧美三级网站| 欧美性生交18XXXXX无码| 91精品导航| 五月丁香六月久久| 草榴在线视频| 天天干天天日天天干| 黄色小视频免费| 亚洲欧美日韩一区| 一级大黄色毛片| 国产69久久精品成人看| 精品无码电影| 99精品在线播放| 综合色区| 婷婷色情网| 国产AV中文| 成人三级在线观看| 国外操逼视频| 天天拍天天操| 欧洲毛片基地c区| 超碰97av| 最新精品视频| 深爱激情网五月天| 日韩A片一级无码免费蜜桃| 第一福利导航大全| 欧美亚洲成人在线| 在线看一区二区三区| 丰满人妻一区二区三区精品高| 日本A片一级| 久久精品苍井空免费一区二| 日韩免费视频| 亚洲成人精品一区二区| 欧美日韩国产在线观看| 熟女少妇一区二区| 日韩在线中文| 熟女内射| 午夜看黄| 男人的天堂久久| 内射无码专区久久亚洲| 911精品国产一区二区在线| 久久精品禁一区二区三区四区五区 | 91AV| 91精品少妇| 日韩精品一二三区| 色优久久| 九九无码视频| 久久AV电影| 中文字幕在线日韩| 91久久久久久久久久久久18| 香蕉一区| 91人妻人人澡人人添人人爽 | 久久网一区| 日韩欧美午夜成人无码| 日逼无码视频| www.俺来也| 91香蕉网| 在线不卡视频| 亚洲日韩免费在线观看| 一区二区免费在线观看| 亚色网址| 婷婷五月六月丁香| 亚洲国产av一区| 日本操逼电影| 99久久9| 亚洲热热| 少妇推油呻吟白浆啪啪成人片| 奶大丰满一乱一视频一区二区三区在| 日本欧美一级| 日本成人免费电影| 久草新在线| 无码视频中文字幕| 黄色大片网站| 国产偷拍网站| 98色色| 五月婷婷色播| 国产欧美一级片| 九九九成人网| www.99热视频| 91人妻视频| 精品一区电影| 久久久久久无码视频| 91高潮| 青青草原国产视频| 蜜桃91精品秘入口| 日韩性爱区| 五月黄片| 五月激情视频| 精品五月天| 先锋影音一区| 超碰成人福利| 操比视频在线观看| 国产久久视频在线观看| 日韩高清一区二区| 二区精品| 91丨人妻丨国产| 精品无码秘人妻一区二区三区| 91嫩操| 欧美日韩中字| 高清无码免费观看| 欧美日韩小电影| 精品国产精品国产精品国产网站| 亚洲日韩第一页| 俺去也www俺去也com| 日韩黄色A片| 亚洲插逼| 777视频在线观看| 国产视频123区| 天天色免费视频| 亚洲精品无码电影| 亚洲a电影| 国产一毛a一毛a在线观看| 国产久久在线| 特写毛茸茸BBwBBwBBw | 精品成人在线观看| 美女黄色视频永费在线观看网站 | 人妻无码一二三区免费| 天美精东蜜桃91| 无码欧美成人AAAA三区在线| 男女视频网站在线观看| wwwA片| 加勒比精品在线| 国产三级视频在线| 精品无码一区二区三区四区五区| 天天操天天干天天日| 精品免费国产一区二区三区四区 | 国产一区二区三区在线视频| 男人操女人免费网站| 久草资源视频| 日韩三级片网站| 日本亚洲黄色视频| 熟女老阿V8888AV| 五月丁香婷中文字幕| 怡春院中文字幕| 极品另类| 一区视频在线| 亚洲精品一区二区三区四区五区六区| 1024手机在线观看| 国产精品电影大全| www.超碰在线| 日皮视频在线看| 青青青亚州视频在线| 北条麻妃视频在线播放| 一本道无码在线观看| 高H视频在线观看| 九九综合伊人7777777| h视频免费看| 5252a我爱haose01我愿| 91香蕉| www.狠狠撸| 草草久久久无码国产专区的优势| 日韩天堂在线观看| 亲孑伦XXXⅹ熟女| 麻豆一区二区三区四区| 91丨人妻丨国产| 久久AV电影| 99人妻人人爽人人添人人精品| 毛片在线观看视频| 九九热8| 免费日韩黄色电影| 色情片在线播放| 欧美h| 懂色Av| 久久精品6| 欧美成人大香蕉| 国产日韩在线视频| 日韩无码内射| 国产精品高| 伊人精品| 国产精久久| 国产特黄级AAAAA片免| 亚洲青草视频| 日批视频| 桃色AV| 99热这里只有精品99| 大鸡吧在线视频| 色综合天天综合网国产成人网 | 久久亚洲婷婷| 精品日韩一区二区三区| 免看一级a毛片一片成人不卡| 亚洲国产视频一区| 蝌蚪窝在线视频观看| 精品交换一区二区三区无码| 999福利视频| 91丨PORN首页| 亚洲人操逼视频| 理论片无码| 一插菊花综合| 国产精品美女久久久久AV爽| 国产aaaaaaaaaa| 操逼免费视频网站| 亚洲Aⅴ| 特级西西444www大胆高清图片| 国产女人18| 一级a黄片| 小黄片在线免费观看| 国产乱婬AV片免费| 青草网在线观看| 爱视频福利网| va色婷婷亚洲在线| 亚洲精品乱码久久久久久蜜桃欧美| www.日韩系列| 69视频在线免费观看| 大鸡吧操逼| 免费无码一区二区三区四区五区 |