久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術文章
文章詳情頁

MyBatis使用Zookeeper保存數據庫的配置可動態刷新的實現代碼

瀏覽:2日期:2023-10-18 11:05:44

核心關鍵點: 封裝一個DataSource, 重寫 getConnection 就可以實現

我們一步一步來看.

環境: Spring Cloud + MyBatis

MyBatis常規方式下配置數據源: 使用Spring的Configuration

package com.cnscud.cavedemo.fundmain.config;import com.cnscud.xpower.dbn.SimpleDBNDataSourceFactory;import org.apache.ibatis.session.SqlSessionFactory;import org.mybatis.spring.SqlSessionFactoryBean;import org.mybatis.spring.SqlSessionTemplate;import org.mybatis.spring.annotation.MapperScan;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 org.springframework.context.annotation.Primary;import org.springframework.core.io.support.PathMatchingResourcePatternResolver;import org.springframework.jdbc.datasource.DataSourceTransactionManager;import org.springframework.transaction.PlatformTransactionManager;import javax.sql.DataSource;/** * Database Config 多數據源配置: 主數據源. * * @author Felix Zhang 2021-08-02 17:30 * @version 1.0.0 */@Configuration@MapperScan(basePackages = {'com.cnscud.cavedemo.fundmain.dao'},sqlSessionFactoryRef = 'sqlSessionFactoryMainDataSource')public class MainDataSourceConfig { //常規配置: 使用application.yml里面的配置. @Primary @Bean(name = 'mainDataSource') @ConfigurationProperties('spring.datasource.main') public DataSource mainDataSource() throws Exception {return DataSourceBuilder.create().build(); } @Primary @Bean(name = 'sqlSessionFactoryMainDataSource') public SqlSessionFactory sqlSessionFactoryMainDataSource(@Qualifier('mainDataSource') DataSource mainDataSource) throws Exception {SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();//org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();//configuration.setMapUnderscoreToCamelCase(true);//factoryBean.setConfiguration(configuration);factoryBean.setConfigLocation(new PathMatchingResourcePatternResolver().getResource('classpath:mybatis-config.xml'));// 使用mainDataSource數據源, 連接mainDataSource庫factoryBean.setDataSource(mainDataSource);//下邊兩句僅僅用于*.xml文件,如果整個持久層操作不需要使用到xml文件的話(只用注解就可以搞定),則不加//指定entity和mapper xml的路徑//factoryBean.setTypeAliasesPackage('com.cnscud.cavedemo.fundmain.model');factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources('classpath:com/cnscud/cavedemo/fundmain/mapper/*.xml'));return factoryBean.getObject(); } @Primary @Bean public SqlSessionTemplate sqlSessionTemplateMainDataSource(@Qualifier('sqlSessionFactoryMainDataSource') SqlSessionFactory sqlSessionTemplateMainDataSource) throws Exception {//使用注解中配置的Factoryreturn new SqlSessionTemplate(sqlSessionTemplateMainDataSource); } @Primary @Bean public PlatformTransactionManager mainTransactionManager(@Qualifier('mainDataSource') DataSource prodDataSource) {return new DataSourceTransactionManager(prodDataSource); }}

這里面獲取數據源的關鍵函數是 mainDataSource, 我們自己來實現就好了:

因為這個是一次性的工作, 所以我們無法修改DataSource的指向, 只能在DataSource內部做文章, 所以我們需要自己實現一個DataSource.

其中的步驟比較多, 我們來看看最終結果:

最終的DataSourceWrapper

它完全封裝了一個DataSource, 自己并沒有任何DataSource的功能:

package com.cnscud.xpower.dbn;import javax.sql.DataSource;import java.io.PrintWriter;import java.sql.Connection;import java.sql.SQLException;import java.sql.SQLFeatureNotSupportedException;import java.util.logging.Logger;/** * Datasource wrapper, 為了方便動態創建DataSource. * * @author Felix Zhang 2021-08-05 14:14 * @version 1.0.0 */public class DynamicByZookeeperDataSourceWrapper implements DataSource { protected SimpleDBNConnectionPool simpleDBNConnectionPool; protected String bizName; public DynamicByZookeeperDataSourceWrapper(SimpleDBNConnectionPool simpleDBNConnectionPool, String bizName) {this.simpleDBNConnectionPool = simpleDBNConnectionPool;this.bizName = bizName; } protected DataSource pickDataSource() throws SQLException{return simpleDBNConnectionPool.getDataSource(bizName); } @Override public Connection getConnection() throws SQLException {return pickDataSource().getConnection(); } @Override public Connection getConnection(String username, String password) throws SQLException {return pickDataSource().getConnection(username, password); } @Override public <T> T unwrap(Class<T> iface) throws SQLException {return pickDataSource().unwrap(iface); } @Override public boolean isWrapperFor(Class<?> iface) throws SQLException {return pickDataSource().isWrapperFor(iface); } @Override public PrintWriter getLogWriter() throws SQLException {return pickDataSource().getLogWriter(); } @Override public void setLogWriter(PrintWriter out) throws SQLException {pickDataSource().setLogWriter(out); } @Override public void setLoginTimeout(int seconds) throws SQLException {pickDataSource().setLoginTimeout(seconds); } @Override public int getLoginTimeout() throws SQLException {return pickDataSource().getLoginTimeout(); } @Override public Logger getParentLogger() throws SQLFeatureNotSupportedException {throw new SQLFeatureNotSupportedException(); }}

SimpleDBNConnectionPool

支持多個數據源的暫存池, 可以根據name獲取不同的數據庫DataSource實例:

這個類負責創建DataSource, 保存在Map里. 并且能監聽Zookeeper的變化, 一旦偵聽到變化, 就close現有的DataSource.

package com.cnscud.xpower.dbn;import com.github.zkclient.IZkDataListener;import com.zaxxer.hikari.HikariDataSource;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import javax.sql.DataSource;import java.sql.Connection;import java.sql.SQLException;import java.util.HashSet;import java.util.Map;import java.util.Set;import java.util.concurrent.ConcurrentHashMap;import static java.lang.String.format;/** * The simple datasource pool. * * 根據名字存放多個數據庫的DataSource, 并且會監聽Zookeeper配置, 動態重建. * * @author adyliu (imxylz@gmail.com) * @since 2011-7-27 */public class SimpleDBNConnectionPool { final Logger logger = LoggerFactory.getLogger(getClass()); private Map<String, DataSource> instances = new ConcurrentHashMap<>(); private final Set<String> watcherSchema = new HashSet<String>(); public DataSource getInstance(String bizName) {try { return findDbInstance(bizName);}catch (SQLException e) { e.printStackTrace();}return null; } public Connection getConnection(String bizName) throws SQLException {DataSource ds = getDataSource(bizName);return ds.getConnection(); } public DataSource getDataSource(String bizName) throws SQLException {return findDbInstance(bizName); } protected void destroyInstance(final String bizName) {synchronized (instances) { DataSource oldInstanceIf = instances.remove(bizName); logger.warn(format('destoryInstance %s and %s', bizName, oldInstanceIf != null ? 'close datasource' : 'do nothing')); if (oldInstanceIf != null) {closeDataSource(oldInstanceIf); }} } protected void closeDataSource(DataSource ds) {if (ds instanceof HikariDataSource) { try {((HikariDataSource) ds).close(); } catch (Exception e) {logger.error('Close datasource failed. ', e); }} } private DataSource createInstance(Map<String, String> dbcfg) {return new SimpleDataSourceBuilder().buildDataSource(dbcfg); } private DataSource findDbInstance(final String bizName) throws SQLException {DataSource ins = instances.get(bizName);if (ins != null) { return ins;}synchronized (instances) {// 同步操作 ins = instances.get(bizName); if (ins != null) {return ins; } boolean success = false; try {Map<String, String> dbcfg = SchemeNodeHelper.getInstance(bizName);if (dbcfg == null) { throw new SQLException('No such datasouce: ' + bizName);}ins = createInstance(dbcfg);//log.warn('ins put '+ins);instances.put(bizName, ins);if (watcherSchema.add(bizName)) { SchemeNodeHelper.watchInstance(bizName, new IZkDataListener() {public void handleDataDeleted(String dataPath) throws Exception { logger.warn(dataPath + ' was deleted, so destroy the bizName ' + bizName); destroyInstance(bizName);}public void handleDataChange(String dataPath, byte[] data) throws Exception { logger.warn(dataPath + ' was changed, so destroy the bizName ' + bizName); destroyInstance(bizName);} });}success = true; } catch (SQLException e) {throw e; } catch (Throwable t) {throw new SQLException('cannot build datasource for bizName: ' + bizName, t); } finally {if (!success) { instances.remove(bizName);} }}return ins; }}

真正創建DataSource的代碼:

package com.cnscud.xpower.dbn;import com.zaxxer.hikari.HikariConfig;import com.zaxxer.hikari.HikariDataSource;import org.apache.commons.lang.StringUtils;import java.util.Map;/** * Hikari DataSource. * * 思考: 可以根據參數里面的類型來使用不同的庫創建DataSource, 例如Druid. (默認為HikariDataSource) * * * @author Felix Zhang 2021-08-05 11:14 * @version 1.0.0 */public class SimpleDataSourceBuilder { public HikariDataSource buildDataSource(Map<String, String> args) {HikariConfig config = new HikariConfig();config.setJdbcUrl(getUrl(args));config.setUsername(args.get('username'));config.setPassword(args.get('password'));config.setDriverClassName(getDriverClassName(args));String maximumPoolSizeKey = 'maximum-pool-size';int maximumPoolSize = 30;if(StringUtils.isNotEmpty(args.get(maximumPoolSizeKey))){ maximumPoolSize = Integer.parseInt(args.get(maximumPoolSizeKey));}config.addDataSourceProperty('cachePrepStmts', 'true'); //是否自定義配置,為true時下面兩個參數才生效config.addDataSourceProperty('prepStmtCacheSize', maximumPoolSize); //連接池大小默認25,官方推薦250-500config.addDataSourceProperty('prepStmtCacheSqlLimit', '2048'); //單條語句最大長度默認256,官方推薦2048config.addDataSourceProperty('useServerPrepStmts', 'true'); //新版本MySQL支持服務器端準備,開啟能夠得到顯著性能提升config.addDataSourceProperty('useLocalSessionState', 'true');config.addDataSourceProperty('useLocalTransactionState', 'true');config.addDataSourceProperty('rewriteBatchedStatements', 'true');config.addDataSourceProperty('cacheResultSetMetadata', 'true');config.addDataSourceProperty('cacheServerConfiguration', 'true');config.addDataSourceProperty('elideSetAutoCommits', 'true');config.addDataSourceProperty('maintainTimeStats', 'false');config.setMaximumPoolSize(maximumPoolSize); //config.setMinimumIdle(10);//最小閑置連接數,默認為0config.setMaxLifetime(600000);//最大生存時間config.setConnectionTimeout(30000);//超時時間30秒config.setIdleTimeout(60000);config.setConnectionTestQuery('select 1');return new HikariDataSource(config); } private String getDriverClassName(Map<String, String> args) {return args.get('driver-class-name'); } private String getUrl(Map<String, String> args) {return args.get('jdbc-url') == null ? args.get('url'): args.get('jdbc-url'); }}

為了方便讀取Zookeeper節點, 還有個SchemeNodeHelper:

支持兩種配置文件的方式 json或者Properties格式:

package com.cnscud.xpower.dbn;import com.cnscud.xpower.configcenter.ConfigCenter;import com.cnscud.xpower.utils.Jsons;import com.github.zkclient.IZkDataListener;import org.apache.commons.lang.StringUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.io.IOException;import java.io.StringReader;import java.util.HashMap;import java.util.Map;import java.util.Properties;/** * 從Zookeeper的 /xpower/dbn節點下讀取數據庫配置. * 內容支持兩種格式: json或者properties格式. * * JSON格式如下: * { * 'jdbc-url': 'jdbc:mysql://127.0.0.1:3306/cavedemo?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC', * 'username': 'dbuser', * 'password': 'yourpassword', * 'driver-class-name': 'com.mysql.cj.jdbc.Driver' * } * * Properties格式如下: * jdbc-url: jdbc:mysql://127.0.0.1:3306/cavedemo?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC * username: dbuser * password: password * driver-class-name: com.mysql.cj.jdbc.Driver * * @author Felix Zhang * @since 2021-8-5 */public class SchemeNodeHelper { static final Logger logger = LoggerFactory.getLogger(SchemeNodeHelper.class); //支持兩種格式: json, properties public static Map<String, String> getInstance(final String instanceName) throws Exception {String data = ConfigCenter.getInstance().getDataAsString('/xpower/dbn/' + instanceName);if(StringUtils.isEmpty(data)){ return null;}data = data.trim();if (data.startsWith('{')) { //as json Map<String, String> swap = Jsons.fromJson(data, Map.class); Map<String, String> result = new HashMap<>(); if (swap != null) {for (String name : swap.keySet()) { result.put(name.toLowerCase(), swap.get(name));} } return result;}else { //as properties Properties props = new Properties(); try {props.load(new StringReader(data)); } catch (IOException e) {logger.error('loading global config failed', e); } Map<String, String> result = new HashMap<>(); for (String name : props.stringPropertyNames()) {result.put(name.toLowerCase(), props.getProperty(name)); } return result;} } public static void watchInstance(final String bizName, final IZkDataListener listener) {final String path = '/xpower/dbn/' + bizName;ConfigCenter.getInstance().subscribeDataChanges(path, listener); }}

實際應用

最后在MyBatis項目中, 替換原有MainDataSource代碼為:

/** * 添加@Primary注解,設置默認數據源,事務管理器. * 此處使用了一個可以動態重建的DataSource, 如果Zookeeper配置改變,會動態重建. */ @Primary @Bean(name = 'mainDataSource') public DataSource mainDataSource() throws Exception {return SimpleDBNDataSourceFactory.getInstance().getDataSource('cavedemo'); }

運行項目, 發現可以連上數據庫, 并且不重啟項目的情況下, 動態修改數據庫配置, 能自動重連.

項目代碼:

https://github.com/cnscud/xpower/tree/main/xpower-main/src/main/java/com/cnscud/xpower/dbn

其中用到的 ConfigCenter 也在這個項目里, 也可以自己實現, 就可以脫離本項目了.

本文來自博客園,作者:飛云~風之谷,轉載請注明原文鏈接:https://www.cnblogs.com/cnscud/p/15103859.html

到此這篇關于MyBatis使用Zookeeper保存數據庫的配置,可動態刷新的文章就介紹到這了,更多相關MyBatis使用Zookeeper保存數據庫的配置,可動態刷新內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Mybatis 數據庫
相關文章:
主站蜘蛛池模板: а√天堂中文在线资源8 | 美女天堂| www.欧美日韩| 岛国在线免费 | 欧美三级在线 | 日韩成人在线一区 | 国产精品久久久久久久久 | 婷婷狠狠 | 国产日韩欧美一区 | 亚洲精品日韩综合观看成人91 | 国产在线欧美 | 欧美一级视频在线观看 | 三级特黄特色视频 | 夜夜操av | 成人一级 | 中文字幕第一页在线 | 成人av网站免费观看 | 中文字幕国产视频 | 精品在线一区二区 | 国产亚洲欧美在线 | 国产一区二区av | 亚洲精品在线视频观看 | 国产成人精品一区二区三区视频 | 91亚洲视频 | 国产视频三区 | 欧美日韩国产高清 | 亚洲国产在 | 一级做a爰片毛片 | 中文字幕第十二页 | 欧美成人一区二区三区片免费 | 国产日韩欧美精品一区二区 | 操操日 | 欧美一区二区视频 | 嫩草视频免费在线观看 | 啪啪网免费 | 草久久久| 91视频免费观看 | 亚洲男人天堂网 | 日韩一区二区在线观看视频 | 亚洲在线视频 | 亚洲精品免费看 | 精品三区在线观看 | 精品人成| 精品欧美乱码久久久久久 | 精品国偷自产国产一区 | 大陆一级毛片免费视频观看 | 超碰一区二区三区 | 欧美日韩一区二区视频在线观看 | 日本三级做a全过程在线观看 | 日韩欧美在线一区 | 午夜视频91 | 国产免费拔擦拔擦8x高清在线人 | 欧美国产一区二区 | 国产日韩精品一区二区 | www.色涩涩.com网站 | 日韩精品在线一区 | 免费在线一区二区 | 一区在线观看视频 | 亚洲a网站 | 欧美日韩精品一区二区在线播放 | 无码日韩精品一区二区免费 | 色偷偷888欧美精品久久久 | 精品国产91久久久久久久 | 成人1区2区| 在线欧美亚洲 | 久久久久国产 | 成人在线一区二区三区 | 国产精品一区二区三 | 中文字幕亚洲欧美日韩在线不卡 | 欧美一级免费在线观看 | 欧美顶级毛片在线播放 | 日韩av免费在线播放 | 在线观看你懂的网站 | 久久久亚洲| 奇米影视奇米色777欧美 | 亚洲精品久久久一区二区三区 | 国产精品久久久久久久久久大牛 | 亚洲福利影院 | 日韩三级网 | √天堂在线 | 久久久久国产精品www | 精品久久久久久久久久久 | 一级免费黄色免费片 | 亚洲福利一区 | 日本aⅴ毛片成人实战推荐 成人免毛片 | 日韩国产一区二区 | 中文字幕日韩一区 | 日韩在线一区二区 | 亚洲一区二区在线播放 | 欧美一区二区三 | 欧美一级视频在线观看 | 国产色 | 久久久久亚洲美女啪啪 | 久久国产精品久久久久久电车 | 99久久免费观看 | 久久久久高清 | 亚洲人成电影网 | 亚洲人人 | 日韩欧美一区二区三区免费观看 | 国产激情视频在线观看 | 久久免费小视频 | 精品国产乱码久久久久久1区2区 | 超碰人人射 | 国产精品禁久久精品 | 色视频www在线播放国产人成 | 国产一区二区视频在线 | 人人干视频 | 日韩在线视频中文字幕 | 高清国产视频 | 男人天堂中文字幕 | 日本亚洲国产一区二区三区 | 一道本一区 | 国产精品久久久久久久久久妞妞 | 国产欧美在线观看 | 成年人视频免费在线看 | 日韩一区二区三区在线观看 | 欧美一级三级 | 精品亚洲一区二区三区四区五区 | 成人精品视频免费在线观看 | 亚洲欧洲精品成人久久奇米网 | 亚洲网站在线播放 | 国产老女人精品毛片久久 | 一级毛片色一级 | a毛片在线免费观看 | 一区二区三区回区在观看免费视频 | 国产精品精品 | 国产精品美女视频 | 大象视频成人在线观看 | 超碰人人在线 | 久久精品国产亚卅av嘿嘿 | 国产成人免费视频网站高清观看视频 | 日本高清中文字幕 | 国产视频一二三区 | 久久精品这里热有精品 | 久草电影网 | 日本黄色免费播放 | 国产片在线观看 | 亚洲视频一区二区三区 | 自拍亚洲 | 国产精品毛片久久久久久 | av免费网站在线观看 | 亚洲一道本 | 可以免费看黄视频的网站 | 欧美日韩六区 | 国产亚洲精品美女久久久久久久久久 | 7799精品视频 | 久久精品免费一区二区三区 | 亚洲第一国产精品 | 欧美一区二区三 | 国产精品久久精品 | 精品一区二区久久久久久久网站 | 国产一二三四在线 | 777777777亚洲妇女 | 欧美日韩中文字幕在线 | 一区视频在线 | 久久综合社区 | 欧美日韩综合精品 | 国产欧美日韩综合精品一 | 亚洲视频在线免费观看 | 欧美日韩精品一区二区三区在线观看 | 日本黄色一级片视频 | 在线视频第一页 | 久久久一二三 | 精品一区不卡 | 成年人福利 | 91视频观看 | 精品视频在线观看 | 亚洲一区二区伦理 | 国产乱码一区二区三区在线观看 | 国产精品国产三级国产aⅴ中文 | 欧美另类一二三四 | 久久性色| 午夜爱视频 | 日日摸夜夜添夜夜添高潮视频 | 精品成人免费一区二区在线播放 | 日韩视频在线观看 | 日本a视频 | 亚洲视频区 | 欧洲毛片 | 国产激情在线观看 | 国产农村妇女精品久久 | 91资源在线观看 | 国产高清在线精品一区二区三区 | 亚洲第一av | 亚洲成人av | 岛国av免费 | 超碰一区 | 影音在线资源 | 国产精品久久久久久久久大全 | 久久青青| 亚洲激情视频在线播放 | 久久成人免费 | 国产精品美女久久久久aⅴ国产馆 | 日韩视频精品 | 亚洲欧洲在线观看 | 欧洲毛片基地 | 欧美激情精品久久久久久变态 | 一区二区三区四区在线 | 日韩在线精品视频 | 欧美日韩视频在线 | 夜夜操导航 | 亚洲视频在线观看视频 | 久久成年人视频 | 国产成人综合av | 在线看国产 | 色天天综合网 | 二区视频 | 色69av| 久久一区 | 国产精品国产 | 国产精品美女www爽爽爽动态图 | 国产大学生援交视频在线观看 | 青青草网 | 精品久久久久久久久久久久 | 久久久久久成人 | 日韩一区二区三区在线观看 | 久久久久国产精品免费免费搜索 | 亚洲人人草 | 97成人在线 | 在线视频 欧美日韩 | 一区二区三区在线免费观看 | 日韩免费区 | 精品免费久久 | 色综合99 | 日本韩国欧美一区 | 中文字幕一区在线观看视频 | 久久一区二区av | 午夜私人影院在线观看 | 久久久av | av色伊人久久综合一区二区 | 中文字幕久久精品 | 日日骚 | av福利网站 | baoyu133. con永久免费视频 | 国产视频综合在线 | 久久天天躁狠狠躁夜夜躁2014 | 亚洲精品视频大全 | 97视频在线 | 亚洲欧洲日韩 | 91精品国产91久久久久久吃药 | 国产精品国产三级国产aⅴ入口 | 91久久精品一区二区三区 | 成人在线播放 | 超碰激情 | 亚洲综合色自拍一区 | 最新黄色网址在线播放 | 亚洲成人中文字幕 | 成人免费视频在线观看 | 亚洲黄色免费 | 国产福利视频 | 亚洲网站在线播放 | 久久9热| 99国产精品99久久久久久 | 日韩av一区在线 | 欧美国产精品一区二区三区 | 亚洲av毛片 | 精品无码久久久久久国产 | 国产欧美日韩综合精品一区二区 | 亚洲成人久久久 | 高清国产一区二区三区四区五区 | 亚洲成人免费av | 国产黄色播放 | 日韩手机在线观看 | 在线观看精品视频网站 | 欧美亚洲另类丝袜综合网动图 | 欧美日韩视频在线播放 | 亚洲网站免费看 | 九九精品视频在线观看 | 亚洲一区免费视频 | av黄色在线看 | xxxx午夜| www.久久久.com| 99视频这里有精品 | 国产精品成人一区二区三区 | 日韩中文一区二区三区 | h色视频在线观看 | 国产一区在线视频 | 日韩精品免费视频 | 欧美成人在线网站 | 欧美日韩中 | 色狠狠一区 | 91极品视频在线观看 | 欧美一区二区在线视频 | 一区二区在线视频 | 国产中文字幕在线 | 日韩欧美大片在线观看 | 成人在线免费网站 | 伊人网站 | a级毛片免费高清视频 | 欧美一二三 | 免费观看的av | 一区二区视频 | 国产精品久久免费视频 | 精品欧美乱码久久久久久 | 天堂资源av | 91精品综合久久久久久五月天 | 久久久久中文字幕 | 日韩激情综合网 | 91社区在线播放 | 亚洲精品二区 | 伊人久久综合影院 | 国产999精品久久久久久 | 国产精品久久久久久久久久东京 | 欧美中文字幕在线 | 成人免费视频一区二区 | 可以在线观看的av网站 | 综合网亚洲 | 日本免费xxxx | 一级黄色毛片 | 久久精品成人 | 国产高清久久 | 亚洲国产精品一区 | 久久国产精品99国产 | 国产精品欧美一区二区三区不卡 | 日韩免费在线观看视频 | 思热99re视热频这里只精品 | 91成人一区 | 久久久国产精品 | 日韩欧美一区二区在线观看 | 中文无码久久精品 | 99久久国产 | 久草在线在线精品观看 | 黄色一级免费看 | 久久这里只有精品首页 | 91麻豆精品国产91久久久更新时间 | 91污在线 | 精品久久久久久亚洲综合网 | 日韩一区二区中文字幕 | www.成人在线视频 | 国产伊人av | 国产精品日韩欧美一区二区 | 亚洲成人精品视频 | 91国偷自产一区二区三区亲奶 | 91精品国产一区二区三区香蕉 | 成人av免费看 | 成人高清 | 黑人av| 男女深夜网站 | 国产黄色大片 | 精品96久久久久久中文字幕无 | 久久精品亚洲精品 | 91色爱| 国产精品久久久久无码av | 四虎影院入口 | 久久国产精品久久久久久电车 | 欧美日韩国产在线看 | 天天艹久久 | 婷婷91 | 欧美日韩在线二区 | 欧美日韩在线播放 | 欧美一级二级视频 | 91久久久久久久久 | 成人av观看| 麻豆专区一区二区三区四区五区 | 国产在线视频xxx | 欧美日韩高清在线一区 | 成人免费小视频 | 黄色在线免费观看 | 伊人影院在线观看 | 综合精品 | 亚洲国产日韩a在线播放性色 | 久久人人爽爽爽人久久久 | 四虎小视频 | 日韩精品2区| www.久久久 | 一区二区三区在线播放 | 国产91富婆养生按摩会所 | 成人小视频在线观看 | 中文字幕综合在线 | 亚洲欧美中文字幕 | 日本一区二区高清不卡 | 欧美成人a | 久久久精品国产 | 国产免费一区二区 | 日韩一区二区三区在线观看 | 国产精品免费av | 国产精品片aa在线观看 | 久久亚洲精品视频 | 一级黄色毛片a | 国产欧美日韩成人 | 欧美精品免费在线 | 天天干狠狠干 | 欧美成人精品一区二区三区 | 中文字幕视频免费观看 | 骚黄视频| 日韩一区在线视频 | 亚洲精美视频 | 中文字幕在线观看2021 | 免费a视频| 午夜影院免费观看 | 国产精品久久久久久一区二区三区 | 欧美a在线 | 黄色国产精品 | 欧美精品一区二区三区手机在线 | 国内精品视频一区二区三区八戒 | 97av在线 | 国产一区二区三区在线 | 久久久国产精品视频 | 国产一区二区视频在线 | 最新国产中文字幕 | 久久蜜桃精品一区二区三区综合网 | 精品久久久久久国产 | 中文字幕亚洲在线观看 | 国产精品禁久久精品 | 欧美成人精品激情在线观看 | 射久久| 日本在线视频观看 | 婷婷国产成人精品视频 | 日韩欧美国产一区二区 | 精品久久久久久久人人人人传媒 | a∨在线观看 | 韩国精品主播一区二区在线观看 | 国产色婷婷精品综合在线播放 | 二区在线观看 | 国产精品www | 国产黄色大片 | 成年人网站国产 | 亚洲永久精品www | 欧美成年黄网站色视频 | 久久久久久久 | 日韩一级二级三级 | 日韩欧美国产一区二区 | 成人精品网站在线观看 | 亚洲国产精品成人 | 特黄av| 成人免费视频7777777 | 天天看天天操 | 精品国产91久久久久久久 | 日韩激情网 | 国产综合视频 | 国产一区二区精品 | 日本亚洲精品一区二区三区 | 欧美日韩在线不卡 | 国产一区二区在线免费观看 | 久久a国产 | 91精品国产91综合久久蜜臀 | www在线看片 | 欧美日韩中文在线 | 中文字幕高清av | 国产欧美综合一区二区三区 | 国产毛片a级 | 成人久久久 | 精品视频在线视频 | 九九亚洲精品 | 一区二区中文 | 久久久久久一区 | 国产视频久久 | 欧美日韩电影一区二区三区 | 中文字幕av第一页 | 欧美精品 在线观看 | 久久久久a | 久久久精 | 精品久久久久久久久久久久久 | 久久久精品一区二区 | 国产精品久久久久久久久久久久 | 免费国产视频 | 能在线观看的黄色网址 | 一区二区三区日韩在线 | 国产免费视频在线 | 久久精品国产99 | 超碰在线人人 | 国产成人精品av | 成人美女免费网站视频 | 超碰在线天天 | 狠狠综合久久av一区二区小说 | 97碰碰碰| 在线视频一区二区 | 波多野结衣中文字幕在线视频 | 国产视频导航 | 日韩一区二区三区在线视频 | 日本综合视频 | 一区二区日韩精品 | 国产在线高清 | 国产一级高清视频 | 久草电影网 | 亚洲一区二区免费看 | 精品久久影院 | 成人av在线网 | 欧美精品一区二区三区在线 | 91亚洲在线 | 成人性视频在线 | 天天操夜夜操 | 99精品免费视频 | 国产视频三区 | 欧美 日韩 国产 在线 | 国户精品久久久久久久久久久不卡 | 久久久久久亚洲 | 亚洲综合国产 | 日本色站 | 中文字幕日韩一区二区三区 | 久久人妖| 日韩快播电影网 | 欧美成人精品一区二区三区 | 高清中文字幕 | a在线播放 | 精品96久久久久久中文字幕无 | 久久精品六| 国产一级片在线播放 | 亚洲国产1区 | 国产精品国产精品国产专区不卡 | 日韩视频一区在线观看 | 日韩小视频网站hq | 欧美日韩视频在线播放 | 亚洲卡一| 国产免费无遮挡 | 久热99| 欧美亚洲国产一区二区三区 | 狠狠的日| 国产亚洲精品久久久久久青梅 | 欧美日韩一区二区中文字幕 | 日韩一区高清视频 | 极品久久| 99久久电影 | 超碰国产一区 | 中文字幕三区 | 国产精品久久久久久久久久 | 亚洲第一网站 | 国产中文一区 | 精品国产一区二区三区在线观看 | 色在线看| 一区三区视频 | 在线视频不卡一区 | 亚洲香蕉在线观看 | 日韩一级在线免费观看 | 久久久久久久国产 | 国产精品美女久久久久久久久久久 | 日韩免费视频 | 久久久精品影院 | 亚洲日本韩国欧美 | 日韩中文在线 | 6080yy精品一区二区三区 | 北条麻妃一区二区三区在线 | 久久黄色网 | 99精品国产一区二区三区 | 午夜激情在线 | 国产精品免费一区二区三区四区 | 在线观看精品91福利 | 久久综合一区二区 | 国产日韩免费 | 国产成人精品一区二区 | 久久国产传媒 | 99视频在线 | 蜜桃一区二区 | 蜜桃精品视频在线 | 欧美精品在欧美一区二区少妇 | 亚洲97色 | 天天爱爱网 | 亚洲a人 | 五月婷婷激情网 | 国产色播| 亚洲生活片 | 成人在线国产 | 日韩午夜电影在线观看 | 日韩中文久久 | 久久亚洲国产精品日日av夜夜 | 福利网址 | 精品久久久久久久 | 97男人的天堂 | 欧美日本高清视频 | 欧美日韩国产高清视频 | 国产亚洲久久 | 国产一级免费视频 | 国产亚洲精品美女久久久久久久久久 | 午夜精品久久久久久久久久久久 | 日韩在线播放一区二区三区 | 成人免费xxx在线观看 | 禁果av一区二区三区 | 欧洲精品久久久 | 国产一区二区三区在线免费观看 | 国产精品18久久久久久久久久久久 | 久久福利电影 | 久久av综合 | 人人av在线 | 日韩手机电影 | 国产精品国产三级国产aⅴ9色 | 免费av一区| 国产91久久久 | 欧美a√ | 国产精品欧美一区二区三区 | 午夜精品| 日韩在线短视频 | www欧美 | 成人影院av| 日本高清中文字幕 | 97视频在线 | 欧美精品一二三 | 国产精品一区一区三区 | 久久精品久久久 | 精品视频在线视频 | 色综合av | 亚洲精品视频在线播放 | 欧美性猛交一区二区三区精品 | 午夜少妇av | 日韩视频免费在线 | 国产欧美一二三区在线粉嫩 | 精品国产欧美一区二区三区不卡 | 九九热这里只有精品6 | 国产精品久久久久久久久久久杏吧 | 亚洲视频精品一区 | 成人精品高清 | 九九热在线视频 | 亚洲成人一区二区 | 久久久国产一区二区 | 日韩免费网站 | 国产精品乱码一区二区三区 | 成人黄色a | 99精品欧美一区二区三区 | 国产高清在线看 | 99精品欧美一区二区三区综合在线 | 国产一区二区三区久久 | 色综合成人 | 精品国产一区二区三区成人影院 | 久久成人免费视频 | 午夜国产羞羞视频免费网站 | 亚洲天堂成人在线 |