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

在 SpringBoot 項(xiàng)目中如何動(dòng)態(tài)切換數(shù)據(jù)源、數(shù)據(jù)庫(kù)?(可直接CV)

數(shù)據(jù)庫(kù) 其他數(shù)據(jù)庫(kù)
如果服務(wù)器搭建的是一主多從多個(gè)mysql數(shù)據(jù)源,主服務(wù)器用來讀。從服務(wù)器用來寫。此時(shí)你在代碼層面用注解指定了一個(gè)增刪改方法到從數(shù)據(jù)源,但是碰巧此時(shí)從數(shù)據(jù)源失效了,那么就會(huì)自動(dòng)的切換到其它服務(wù)器。

前言

本文參考若依源碼,介紹了如何在SpringBoot項(xiàng)目中使用AOP和自定義注解實(shí)現(xiàn)MySQL主從數(shù)據(jù)庫(kù)的動(dòng)態(tài)切換,當(dāng)從庫(kù)故障時(shí),能自動(dòng)切換到主庫(kù),確保服務(wù)的高可用性。

實(shí)現(xiàn)效果:

如果服務(wù)器搭建的是一主多從多個(gè)mysql數(shù)據(jù)源,主服務(wù)器用來讀。從服務(wù)器用來寫。此時(shí)你在代碼層面用注解指定了一個(gè)增刪改方法到從數(shù)據(jù)源,但是碰巧此時(shí)從數(shù)據(jù)源失效了,那么就會(huì)自動(dòng)的切換到其它服務(wù)器。

為什么要切換數(shù)據(jù)源,有哪些應(yīng)用場(chǎng)景?

動(dòng)態(tài)切換數(shù)據(jù)源通常是為了滿足以下需求:

  • 讀寫分離: 在數(shù)據(jù)庫(kù)架構(gòu)中,為了提高性能和可用性,常常使用主從復(fù)制的方式。主數(shù)據(jù)庫(kù)處理寫操作,而從數(shù)據(jù)庫(kù)處理讀操作。動(dòng)態(tài)切換數(shù)據(jù)源可以在不同的操作中使用不同的數(shù)據(jù)庫(kù),以達(dá)到優(yōu)化性能的目的。
  • 多租戶架構(gòu): 在SaaS(Software as a Service)應(yīng)用中,不同的租戶可能需要操作不同的數(shù)據(jù)庫(kù)。動(dòng)態(tài)數(shù)據(jù)源允許系統(tǒng)根據(jù)租戶的身份來切換到對(duì)應(yīng)的數(shù)據(jù)源。
  • 分庫(kù)分表: 在處理大規(guī)模數(shù)據(jù)時(shí),可能會(huì)采用分庫(kù)分表的策略來分散數(shù)據(jù)存儲(chǔ)的壓力。動(dòng)態(tài)切換數(shù)據(jù)源可以在執(zhí)行跨庫(kù)或跨表操作時(shí),根據(jù)需要切換到正確的數(shù)據(jù)源。
  • 環(huán)境隔離: 在開發(fā)、測(cè)試和生產(chǎn)環(huán)境中,可能需要連接到不同的數(shù)據(jù)庫(kù)。動(dòng)態(tài)數(shù)據(jù)源可以在不同環(huán)境之間無縫切換,以確保數(shù)據(jù)的隔離和安全性。
  • 靈活的數(shù)據(jù)庫(kù)管理: 在復(fù)雜的業(yè)務(wù)場(chǎng)景下,可能需要根據(jù)不同的業(yè)務(wù)邏輯來選擇不同的數(shù)據(jù)源。動(dòng)態(tài)數(shù)據(jù)源提供了這種靈活性,允許開發(fā)者根據(jù)運(yùn)行時(shí)的條件來選擇最合適的數(shù)據(jù)源。
  • 故障轉(zhuǎn)移和高可用性: 當(dāng)主數(shù)據(jù)庫(kù)不可用時(shí),動(dòng)態(tài)切換數(shù)據(jù)源可以自動(dòng)或手動(dòng)切換到備用數(shù)據(jù)庫(kù),以保證服務(wù)的連續(xù)性和數(shù)據(jù)的可用性。

如何切換數(shù)據(jù)源?

  • SpringBoot版本:3.0.4
  • jdk版本:JDK17
1.pom文件
<dependency>
  <groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- aop切面-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!--druid連接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.20</version>
</dependency>
<!--mysql驅(qū)動(dòng)-->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
<!--MybatisPlus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
2.配置文件:application.yml、application-druid.yml

application.yml配置文件:

#application.yml
 
server:
  port: 8000
spring:
  profiles:
    active: druid

application-druid.yml配置文件:

# 數(shù)據(jù)源配置
spring:
datasource:
    type:com.alibaba.druid.pool.DruidDataSource
    driverClassName:com.mysql.cj.jdbc.Driver
    druid:
      # 主庫(kù)數(shù)據(jù)源
      master:
        url:jdbc:mysql://localhost:3306/study?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username:root
        password:123456
      # 從庫(kù)數(shù)據(jù)源
      slave:
        # 從數(shù)據(jù)源開關(guān)/默認(rèn)關(guān)閉
        enabled:true
        url:jdbc:mysql://localhost:3306/t_lyj?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username:root
        password:123456
      # 初始連接數(shù)
      initialSize:5
      # 最小連接池?cái)?shù)量
      minIdle:10
      # 最大連接池?cái)?shù)量
      maxActive:20
      # 配置獲取連接等待超時(shí)的時(shí)間
      maxWait:60000
      # 配置連接超時(shí)時(shí)間
      connectTimeout:30000
      # 配置網(wǎng)絡(luò)超時(shí)時(shí)間
      socketTimeout:60000
      # 配置間隔多久才進(jìn)行一次檢測(cè),檢測(cè)需要關(guān)閉的空閑連接,單位是毫秒
      timeBetweenEvictionRunsMillis:60000
      # 配置一個(gè)連接在池中最小生存的時(shí)間,單位是毫秒
      minEvictableIdleTimeMillis:300000
      # 配置一個(gè)連接在池中最大生存的時(shí)間,單位是毫秒
      maxEvictableIdleTimeMillis:900000
3、數(shù)據(jù)源名稱枚舉DataSourceType
/**
 * 數(shù)據(jù)源
 * 
 * @author ruoyi
 */
public enum DataSourceType
{
    /**
     * 主庫(kù)
     */
    MASTER,
 
    /**
     * 從庫(kù)
     */
    SLAVE
}
4、Bean工具類SpringUtils
@Component
publicfinalclass SpringUtils implements BeanFactoryPostProcessor, ApplicationContextAware 
{
    /** Spring應(yīng)用上下文環(huán)境 */
    privatestatic ConfigurableListableBeanFactory beanFactory;

    privatestatic ApplicationContext applicationContext;

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException 
    {
        SpringUtils.beanFactory = beanFactory;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException 
    {
        SpringUtils.applicationContext = applicationContext;
    }

    /**
     * 獲取對(duì)象
     *
     * @param name
     * @return Object 一個(gè)以所給名字注冊(cè)的bean的實(shí)例
     * @throws BeansException
     *
     */
    @SuppressWarnings("unchecked")
    publicstatic <T> T getBean(String name) throws BeansException
    {
        return (T) beanFactory.getBean(name);
    }

    /**
     * 獲取類型為requiredType的對(duì)象
     *
     * @param clz
     * @return
     * @throws BeansException
     *
     */
    publicstatic <T> T getBean(Class<T> clz) throws BeansException
    {
        T result = (T) beanFactory.getBean(clz);
        return result;
    }

    /**
     * 如果BeanFactory包含一個(gè)與所給名稱匹配的bean定義,則返回true
     *
     * @param name
     * @return boolean
     */
    public static boolean containsBean(String name)
    {
        return beanFactory.containsBean(name);
    }

    /**
     * 判斷以給定名字注冊(cè)的bean定義是一個(gè)singleton還是一個(gè)prototype。 如果與給定名字相應(yīng)的bean定義沒有被找到,將會(huì)拋出一個(gè)異常(NoSuchBeanDefinitionException)
     *
     * @param name
     * @return boolean
     * @throws NoSuchBeanDefinitionException
     *
     */
    public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException
    {
        return beanFactory.isSingleton(name);
    }

    /**
     * @param name
     * @return Class 注冊(cè)對(duì)象的類型
     * @throws NoSuchBeanDefinitionException
     *
     */
    publicstatic Class<?> getType(String name) throws NoSuchBeanDefinitionException
    {
        return beanFactory.getType(name);
    }

    /**
     * 如果給定的bean名字在bean定義中有別名,則返回這些別名
     *
     * @param name
     * @return
     * @throws NoSuchBeanDefinitionException
     *
     */
    publicstatic String[] getAliases(String name) throws NoSuchBeanDefinitionException
    {
        return beanFactory.getAliases(name);
    }

    /**
     * 獲取aop代理對(duì)象
     * 
     * @param invoker
     * @return
     */
    @SuppressWarnings("unchecked")
    publicstatic <T> T getAopProxy(T invoker)
    {
        return (T) AopContext.currentProxy();
    }

    /**
     * 獲取當(dāng)前的環(huán)境配置,無配置返回null
     *
     * @return 當(dāng)前的環(huán)境配置
     */
    publicstatic String[] getActiveProfiles()
    {
        return applicationContext.getEnvironment().getActiveProfiles();
    }

    /**
     * 獲取當(dāng)前的環(huán)境配置,當(dāng)有多個(gè)環(huán)境配置時(shí),只獲取第一個(gè)
     *
     * @return 當(dāng)前的環(huán)境配置
     */
    public static String getActiveProfile()
    {
        final String[] activeProfiles = getActiveProfiles();
        return StringUtils.isNotEmpty(Arrays.toString(activeProfiles)) ? activeProfiles[0] : null;
    }

    /**
     * 獲取配置文件中的值
     *
     * @param key 配置文件的key
     * @return 當(dāng)前的配置文件的值
     *
     */
    public static String getRequiredProperty(String key)
    {
        return applicationContext.getEnvironment().getRequiredProperty(key);
    }
}
5、多數(shù)據(jù)源切換注解DataSource
/**
 * 自定義多數(shù)據(jù)源切換注解
 *
 * 優(yōu)先級(jí):先方法,后類,如果方法覆蓋了類上的數(shù)據(jù)源類型,以方法的為準(zhǔn),否則以類上的為準(zhǔn)
 *
 * @author lyj
 */
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface DataSource
{
    /**
     * 切換數(shù)據(jù)源名稱
     */
    public DataSourceType value() default DataSourceType.MASTER;
}
6、數(shù)據(jù)源解析配置類DruidConfig
@Configuration
publicclass DruidConfig {

   @Bean
   @ConfigurationProperties("spring.datasource.druid.master")
   public DataSource masterDataSource(DruidProperties druidProperties){
       DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
       return druidProperties.dataSource(dataSource);
   }

   @Bean
   @ConfigurationProperties("spring.datasource.druid.slave")
   @ConditionalOnProperty(prefix = "spring.datasource.druid.slave", name = "enabled", havingValue = "true")
   public DataSource slaveDataSource(DruidProperties druidProperties) {
       DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
       return druidProperties.dataSource(dataSource);
   }

   @Bean(name = "dynamicDataSource")
   @Primary
   public DynamicDataSource dataSource(DataSource masterDataSource) {
       Map<Object, Object> targetDataSources = new HashMap<>();
       targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource);
       setDataSource(targetDataSources, DataSourceType.SLAVE.name(), "slaveDataSource");
       returnnew DynamicDataSource(masterDataSource, targetDataSources);
   }


   /**
    * 設(shè)置數(shù)據(jù)源
    *
    * @param targetDataSources 備選數(shù)據(jù)源集合
    * @param sourceName 數(shù)據(jù)源名稱
    * @param beanName bean名稱
    */
   public void setDataSource(Map<Object, Object> targetDataSources, String sourceName, String beanName) {
       try {
           DataSource dataSource = SpringUtils.getBean(beanName);
           targetDataSources.put(sourceName, dataSource);
       } catch (Exception e) {
       }
   }
}
7、數(shù)據(jù)源注入核心類DynamicDataSource
/**
 * 動(dòng)態(tài)數(shù)據(jù)源
 * 
 * @author lyj
 */
publicclass DynamicDataSource extends AbstractRoutingDataSource {
    public DynamicDataSource(DataSource defaultTargetDataSource, Map<Object, Object> targetDataSources)
    {
        //設(shè)置默認(rèn)數(shù)據(jù)源
        super.setDefaultTargetDataSource(defaultTargetDataSource);
        //設(shè)置目標(biāo)數(shù)據(jù)源的映射
        super.setTargetDataSources(targetDataSources);
        //初始化
        super.afterPropertiesSet();
    }

    @Override
    protected Object determineCurrentLookupKey()
    {
        return DynamicDataSourceContextHolder.getDataSourceType();
    }
}
8、數(shù)據(jù)源切換處理類DynamicDataSourceContextHolder
/**
 * 數(shù)據(jù)源切換處理
 * 
 * @author lyj
 */
publicclass DynamicDataSourceContextHolder
{
    publicstaticfinal Logger log = LoggerFactory.getLogger(DynamicDataSourceContextHolder.class);

    /**
     * 使用ThreadLocal維護(hù)變量,ThreadLocal為每個(gè)使用該變量的線程提供獨(dú)立的變量副本,
     * 所以每一個(gè)線程都可以獨(dú)立地改變自己的副本,而不會(huì)影響其它線程所對(duì)應(yīng)的副本。
     */
    privatestaticfinal ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();

    /**
     * 設(shè)置數(shù)據(jù)源的變量
     */
    public static void setDataSourceType(String dsType)
    {
        log.info("切換到{}數(shù)據(jù)源", dsType);
        CONTEXT_HOLDER.set(dsType);
    }

    /**
     * 獲得數(shù)據(jù)源的變量,默認(rèn)使用主數(shù)據(jù)源
     */
    public static String getDataSourceType()
    {
        return CONTEXT_HOLDER.get() == null ? DataSourceType.MASTER.name() : CONTEXT_HOLDER.get();
    }

    /**
     * 清空數(shù)據(jù)源變量
     */
    public static void clearDataSourceType()
    {
        CONTEXT_HOLDER.remove();
    }
}
9、Aop切面類
@Aspect
@Order(1)
@Component
publicclass DataSourceAspect {


    @Pointcut("@annotation(com.LYJ.study.DynamicDataSource.annocation.DataSource)"
            + "|| @within(com.LYJ.study.DynamicDataSource.annocation.DataSource)")
    public void dsPointCut(){}

    @Around("dsPointCut()")

    public Object around(ProceedingJoinPoint joinPoint) throws Throwable{
        DataSource dataSource = getDataSource(joinPoint);
        if (dataSource != null){
            DynamicDataSourceContextHolder.setDataSourceType(dataSource.value().name());
        }
        try {
            return joinPoint.proceed();
        }
        finally {
            // 銷毀數(shù)據(jù)源 在執(zhí)行方法之后
            DynamicDataSourceContextHolder.clearDataSourceType();
        }
    }

    /**
     * 獲取需要切換的數(shù)據(jù)源
     */
    public DataSource getDataSource(ProceedingJoinPoint point)
    {
        MethodSignature signature = (MethodSignature) point.getSignature();
        com.LYJ.study.DynamicDataSource.annocation.DataSource dataSource = AnnotationUtils.findAnnotation(signature.getMethod(), com.LYJ.study.DynamicDataSource.annocation.DataSource.class);
        if (Objects.nonNull(dataSource)) {
            return dataSource;
        }
        return AnnotationUtils.findAnnotation(signature.getDeclaringType(), DataSource.class);
    }
}
10、在業(yè)務(wù)中使用

圖片圖片

@Service
@RequiredArgsConstructor
@DataSource(value=DataSourceType.MASTER)
//@DataSource(value=DataSourceType.SLAVE)
publicclass UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    privatefinal UserMapper userMapper;
    @Override
    @DataSource(value=DataSourceType.MASTER)
    //@DataSource(value=DataSourceType.SLAVE)
    public List<User> queryAll() {
        return userMapper.selectList(null);
    }
}

我們?cè)趕ervice、mapper的類和方法上使用都可以。

補(bǔ)充:有很多從數(shù)據(jù)源怎么辦?

我們上面已經(jīng)配置了一個(gè)從數(shù)據(jù)源了,接下來我們繼續(xù)配置多個(gè)從數(shù)據(jù)源

首先在application-druid.yml文件添加新的數(shù)據(jù)源

圖片圖片

在枚舉添加數(shù)據(jù)源名稱

//如果配置多數(shù)據(jù)源,繼續(xù)添加即可
public enum DataSourceType
{
    /**
     * 主庫(kù)
     */
    MASTER,
 
    /**
     * 從庫(kù)
     */
    SLAVE,
    /**
     * 從庫(kù)2
     */
    SLAVE2
}

圖片圖片

如何切換數(shù)據(jù)庫(kù)?

我們就以O(shè)racle為例

<!--oracle驅(qū)動(dòng)-->
<dependency>
  <groupId>com.oracle</groupId>
  <artifactId>ojdbc6</artifactId>
  <version>11.2.0.3</version>
</dependency>

在application-druid.yml添加

slave3:
  # 從數(shù)據(jù)源開關(guān)/默認(rèn)關(guān)閉
  enabled: true
  url: jdbc:oracle:thin:@127.0.0.1:1521:oracle
  username: root
  password: password

然后刪除指定的mysql驅(qū)動(dòng),默認(rèn)會(huì)自動(dòng)尋找驅(qū)動(dòng)

圖片

添加數(shù)據(jù)源和用法參考上面即可,都是一樣的。

注意:在切換數(shù)據(jù)庫(kù)時(shí),因?yàn)閙ysql跟Oracle的sql語法有差別,啟動(dòng)時(shí)可能報(bào)錯(cuò)。

責(zé)任編輯:武曉燕 來源: 碼猿技術(shù)專欄
相關(guān)推薦

2010-12-31 16:22:04

Analysis Se

2023-01-04 09:33:31

SpringBootMybatis

2024-01-22 09:43:50

數(shù)據(jù)庫(kù)方案

2025-01-17 09:11:51

2022-05-10 10:43:35

數(shù)據(jù)源動(dòng)態(tài)切換Spring

2020-03-13 14:05:14

SpringBoot+數(shù)據(jù)源Java

2024-03-28 09:46:50

2024-10-30 10:22:17

2024-04-30 09:17:06

SpringBootMybatis動(dòng)態(tài)數(shù)據(jù)源

2023-02-06 14:44:00

嚴(yán)選數(shù)據(jù)源DB

2024-11-20 09:12:56

2023-09-07 08:39:39

copy屬性數(shù)據(jù)源

2011-07-13 15:32:38

ODBC數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序系統(tǒng)DSN

2011-03-10 08:42:15

SQL Server備份還原

2023-06-07 08:08:37

MybatisSpringBoot

2024-02-23 11:36:57

數(shù)據(jù)庫(kù)Python

2010-12-27 09:59:11

ODBC數(shù)據(jù)源

2009-06-15 13:24:46

JBoss數(shù)據(jù)源

2023-12-13 12:20:36

SpringMySQL數(shù)據(jù)源

2021-03-10 19:01:02

SQL數(shù)據(jù)源
點(diǎn)贊
收藏

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

亚洲三级av| 最新国产在线拍揄自揄视频| 老牛嫩草一区二区三区日本 | 国产成人一区二区三区| 国产精品1区2区3区4区| 欧一区二区三区| 疯狂欧美牲乱大交777| 日韩视频精品| 亚洲国产精彩视频| 日本午夜一区二区| 国内精品久久久久影院优| 午夜时刻免费入口| 精品欧美视频| 91电影在线观看| 久久久久99精品成人片| 国产黄在线播放| 成人高清免费观看| 国产日韩精品一区二区| 日韩欧美亚洲一区二区三区| 国产精品二区不卡| 亚洲人成网在线播放| 欧美老女人bb| 96sao精品免费视频观看| 欧美日韩国产中字| 无码熟妇人妻av在线电影| 国产69久久| 99国产欧美另类久久久精品| 成人黄色免费在线观看| 免费黄色网址在线| 亚洲经典三级| 欧美黑人巨大xxx极品| 日韩av毛片在线观看| 神马电影久久| 精品一区二区三区电影| 五月天丁香社区| 欧美h版在线观看| 欧美日韩精品一区二区三区蜜桃 | 成人精品免费网站| 18成人免费观看网站下载| 一区二区三区麻豆| 视频一区中文字幕| 国产精品69久久久久| 日韩女优在线观看| 在线亚洲成人| 777777777亚洲妇女| 久久久久久av无码免费网站| 婷婷综合五月| 久久国产精品电影| 国产稀缺精品盗摄盗拍| 91精品电影| yw.139尤物在线精品视频| 国产三级黄色片| 不卡中文字幕| 日韩中文理论片| 国产大屁股喷水视频在线观看| 久久综合影院| 亚洲午夜av电影| 国产不卡在线观看视频| 日韩毛片视频| 久久精品免费播放| 久久久久亚洲av无码专区体验| 91精品国产乱码久久久久久 | 亚洲国产精品网站| 玖草视频在线观看| 久久不见久久见免费视频7| 亚洲日韩第一页| www.99热| 欧美伊人影院| 久久久久久久久久国产精品| 精品国产乱码一区二区| 久久久精品午夜少妇| 国产福利精品视频| 97超碰人人模人人人爽人人爱| 久久精品国产一区二区三区免费看| 国产精品久久久久免费a∨大胸| 亚洲av无码乱码国产精品fc2| 久久国产成人午夜av影院| 成人激情综合网| 亚洲国产欧美另类| www欧美成人18+| 亚洲春色在线| 亚洲欧美成人影院| 欧美视频在线免费| 污污网站免费观看| 91综合久久爱com| 亚洲精品在线视频| 国产尤物在线播放| 99视频+国产日韩欧美| 国产精品aaa| xxxx18国产| 久久久不卡影院| 亚洲国产精品女人| 午夜影院在线播放| 欧美一区二区三区免费观看视频| 天天躁日日躁狠狠躁av| 国产中文字幕一区二区三区| 欧美裸体男粗大视频在线观看| 国产精品老女人| 精品一区二区三区免费播放| 国产在线精品一区二区三区》| 国产在线网站| 亚洲综合久久久久| 免费一级特黄录像| 第四色在线一区二区| 一区二区三区国产在线观看| 欧美成人精品一区二区免费看片| 免费日韩av片| 波多野结衣精品久久| 9色在线视频网站| 天天综合网天天综合色| 亚洲黄色片免费| 国产成人调教视频在线观看 | 亚洲高清av在线| 天天摸日日摸狠狠添| 亚洲人www| 91亚洲精华国产精华| 欧洲亚洲精品视频| 亚洲综合精品久久| 中文字幕第17页| 色婷婷久久久| 欧美精品久久久久a| 91精品国产乱码久久久久| 91偷拍与自偷拍精品| 欧美日韩中文字幕在线播放| 亚洲精品555| 亚洲欧美激情在线视频| 日韩欧美大片在线观看| 国产白丝精品91爽爽久久| 亚洲一一在线| 精品裸体bbb| 亚洲视频一区二区三区| 中日韩精品视频在线观看| 国产成人综合视频| 300部国产真实乱| 精品国产一区二区三区性色av | 欧美一区二区福利视频| 纪美影视在线观看电视版使用方法| 亚洲女人av| 精品日韩电影| 忘忧草在线影院两性视频| 亚洲大胆人体av| 久久免费视频精品| 成人综合婷婷国产精品久久免费| 亚洲av首页在线| 日韩成人精品| 欧美国产亚洲视频| 亚洲成人77777| 亚洲国产中文字幕在线视频综合| 精产国品一区二区三区| 亚洲人metart人体| 亚洲字幕一区二区| 天堂av资源在线观看| 日韩美女视频一区二区在线观看| 欧美成人精品激情在线视频| 国产精品自拍网站| www.男人天堂网| 精品按摩偷拍| 日韩免费视频在线观看| 岛国在线视频| 欧美日韩dvd在线观看| 欧美色视频一区二区三区在线观看| 精品一区二区三区香蕉蜜桃| 亚洲一区 在线播放| 在线精品视频一区| 午夜精品美女自拍福到在线| 男人的天堂在线免费视频| 欧美视频一二三| 亚洲av毛片基地| 国产在线视频一区二区| 人体内射精一区二区三区| 日韩aaa久久蜜桃av| 国产成人免费av| 免费av网站在线观看| 精品国产免费一区二区三区四区| 精品91久久久| 国产精品理伦片| 亚洲精品一区二区18漫画| 亚洲少妇自拍| 午夜精品一区二区在线观看 | 精品一区二区三区日本| 欧美三区四区| 欧美日韩福利电影| 久草视频在线看| 777午夜精品视频在线播放| 国产一级一片免费播放放a| 久久精品日韩一区二区三区| 亚洲理论中文字幕| 亚洲久色影视| 一区二区视频在线免费| 成人性生交大片免费看96| 日本亚洲欧洲色α| 97影院秋霞午夜在线观看| 亚洲精品白浆高清久久久久久| 中国一级片黄色一级片黄| 亚洲欧美激情插| 91中文字幕永久在线| 国产米奇在线777精品观看| 人人妻人人添人人爽欧美一区| 青青草91久久久久久久久| 国产精品theporn88| 日本.亚洲电影| 97视频在线观看免费高清完整版在线观看| 成人影院免费观看| 亚洲国产欧美一区二区三区同亚洲 | 欧美日韩三级电影在线| 欧美一区二区三区在线免费观看| 国产乱码精品一区二区三区亚洲人 | 国产va在线播放| 国产三级一区二区| 在线黄色免费网站| 精品一区二区久久| 欧美成人免费高清视频| 黄色免费成人| 中国一级大黄大黄大色毛片| 国产一卡不卡| 韩国成人av| 一区二区三区四区视频免费观看| 国产精品免费久久久| 欧美男人天堂| 午夜精品久久久久久久99黑人 | 亚洲成人午夜电影| 中国毛片直接看| 国产精品国产三级国产普通话三级| av无码一区二区三区| 国产成人亚洲综合a∨猫咪| 欧美婷婷精品激情| 日本在线观看不卡视频| 女性女同性aⅴ免费观女性恋| 国内精品福利| 国产精品视频一二三四区| 国产精品二区不卡| 亚洲欧美精品| 日韩成人激情| 神马影院我不卡午夜| 最新亚洲精品| 蜜桃臀一区二区三区| 久久影视三级福利片| 国产精品一区二区免费看| 美女精品久久| 7777精品伊久久久大香线蕉语言| 亚洲一区二区av| 国产欧美va欧美va香蕉在| 成人黄色毛片| 国产精品一区av| 天堂久久一区| 亚洲永久免费观看| 91精品入口| 国产精品美女久久久久av福利| 97成人在线| 国产精品国产三级国产专区53| 日本超碰一区二区| 国产精品免费一区二区三区在线观看 | 欧美精品久久久久性色| 亚洲精品成人少妇| 久久久久久福利| 午夜亚洲福利老司机| 日本va欧美va国产激情| 色综合天天综合| 69视频免费看| 欧美日韩国产综合视频在线观看| 国产精品欧美久久久久天天影视 | 亚洲免费999| 国产一区二区美女| 欧美一级片在线免费观看| 北条麻妃国产九九精品视频| 在线观看免费视频黄| 久久午夜国产精品| 超碰人人干人人| 亚洲女女做受ⅹxx高潮| 久久网一区二区| 欧美午夜影院在线视频| 久久久精品毛片| 91精品国产91久久久久久一区二区 | 亚洲最新视频在线| 国产原创精品视频| 国内精品久久久久久久久| 无遮挡爽大片在线观看视频| 国产精品自拍偷拍视频| 国产一区二区三区亚洲综合| 国产三级精品在线不卡| 精品国产日韩欧美| 国产911在线观看| 美女尤物久久精品| 亚洲精品国产久| 26uuu另类欧美| 午夜精品一区二区三区视频| 婷婷激情综合网| 一本久道久久综合无码中文| 日韩欧美中文字幕精品| 青春有你2免费观看完整版在线播放高清| 在线精品视频视频中文字幕| 黄页在线观看免费| 国产精品美女主播| 国产精品网在线观看| 日韩影视精品| 亚洲精品欧美| 亚洲一二三av| 国产亚洲人成网站| 亚洲精品午夜久久久久久久| 欧美日韩激情一区二区| 日本高清视频www| 精品国产欧美成人夜夜嗨| 亚洲十八**毛片| 99在线观看视频网站| 欧美日韩精品一区二区视频| 成人免费在线网| 国产尤物一区二区| gv天堂gv无码男同在线观看| 亚洲一区二区高清| 国产美女自慰在线观看| 亚洲欧美国产精品久久久久久久| 日本在线观看大片免费视频| 国产精品精品国产| 美女呻吟一区| 少妇大叫太大太粗太爽了a片小说| 美国十次了思思久久精品导航| 国产精品第七页| 亚洲综合色丁香婷婷六月图片| 亚洲网站免费观看| 亚洲区中文字幕| 老色鬼在线视频| 国产欧美一区二区在线播放| 中文字幕av亚洲精品一部二部| 日韩av手机版| 久久综合视频网| 五月婷婷开心网| 亚洲精品国产suv| 成人女同在线观看| 99久久免费国| 中文无码久久精品| 国产又粗又猛大又黄又爽| 中文字幕在线不卡一区二区三区| 波多野结衣二区三区| 日韩精品极品毛片系列视频| 黄页网站大全在线免费观看| 99r国产精品视频| 欧美成人一品| 国产精品一级无码| 一区二区三区在线免费视频| 国产女人高潮的av毛片| 日韩在线小视频| 亚洲一区二区av| 超碰10000| 国产a精品视频| 日本学生初尝黑人巨免费视频| 日韩欧美三级在线| 蜜桃成人365av| 精品国产乱码久久久久软件 | 欧美一级视频在线| 亚洲欧洲美洲综合色网| 国产精品国产av| 久热精品在线视频| 伊人精品久久| 丝袜老师办公室里做好紧好爽 | 免费成人美女在线观看.| 少妇太紧太爽又黄又硬又爽小说| 色8久久精品久久久久久蜜| 国产一区二区三区福利| 国产精品96久久久久久| 日韩欧美高清在线播放| 亚洲涩涩在线观看| 亚洲一区二区三区中文字幕| 日本黄色大片视频| 国产成人精品免高潮在线观看| 成人6969www免费视频| 日本不卡一区在线| 亚洲精品免费播放| 手机在线精品视频| 国产成人精品免高潮费视频| 日韩av二区| xxxx国产视频| 欧美日韩激情小视频| 亚洲搞黄视频| 成人资源av| 视频在线在亚洲| 丰满少妇被猛烈进入一区二区| 欧美mv日韩mv| 伊人久久av| 天天在线免费视频| 97久久人人超碰| 一卡二卡在线视频| 97国产suv精品一区二区62| 国产一区二区精品福利地址| 伊人色在线视频| 午夜精品久久久久| 日韩在线资源| 国产在线一区二区三区四区 | 一级黄色电影片| 欧美日韩在线视频一区| 免费大片黄在线观看视频网站| 国产欧美日韩综合一区在线观看 | 精品久久久香蕉免费精品视频| 国产69久久| 国模精品一区二区三区| 麻豆国产欧美日韩综合精品二区| 青青草成人免费| 国产亚洲欧美一区| 国产一区调教| 亚洲欧美aaa| 色一情一伦一子一伦一区|