99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

SpringBoot+MyBatisPlus多數(shù)據(jù)源動態(tài)切換實(shí)戰(zhàn):MySQL與SqlServer

SpringBoot+MyBatisPlus多數(shù)據(jù)源動態(tài)切換實(shí)戰(zhàn):MySQL與SqlServer 1. 項目背景與多數(shù)據(jù)源需求拆解1.1 為什么一個項目會同時連上 MySQL 和 SqlServer在實(shí)際業(yè)務(wù)里一套服務(wù)對接多個數(shù)據(jù)庫的需求比想象中要普遍。我這次遇到的項目就是一個典型的傳統(tǒng)行業(yè)改造場景老系統(tǒng)跑在 SqlServer 上沉淀了十多年的歷史數(shù)據(jù)包括訂單流水、人員檔案、流程審批記錄這些數(shù)據(jù)不能說丟就丟也不可能短期內(nèi)做完整遷移。而新開發(fā)的業(yè)務(wù)模塊比如用戶畫像、消息推送、數(shù)據(jù)分析報表則更適合放到 MySQL 里畢竟這套技術(shù)棧更輕量生態(tài)也更活躍團(tuán)隊維護(hù)起來成本更低。項目要求很直白同一個 SpringBoot 服務(wù)里既要能查 SqlServer 里的歷史數(shù)據(jù)又要能讀寫 MySQL 里的新業(yè)務(wù)數(shù)據(jù)還得保證切換過程對業(yè)務(wù)代碼盡可能透明。翻譯成技術(shù)語言就是要在 MyBatisPlus 這套 ORM 框架下實(shí)現(xiàn)多數(shù)據(jù)源接入和動態(tài)切換。這里先說明一個容易混淆的概念。多數(shù)據(jù)源和讀寫分離是兩回事。讀寫分離是同一個數(shù)據(jù)庫的主從副本結(jié)構(gòu)完全一致只是分擔(dān)讀寫的壓力。多數(shù)據(jù)源則是多個獨(dú)立的數(shù)據(jù)庫實(shí)例結(jié)構(gòu)可能完全不同甚至數(shù)據(jù)庫類型都不一樣——MySQL 和 SqlServer 在 SQL 語法、分頁方式、數(shù)據(jù)類型上都有差異。本次項目屬于后者難點(diǎn)在于不是簡單配兩個連接池就完事而是要讓上層業(yè)務(wù)代碼在幾乎無感知的情況下完成數(shù)據(jù)源的切換。1.2 方案選型對比分包、AOP切面還是動態(tài)路由多數(shù)據(jù)源的實(shí)現(xiàn)方案業(yè)界主流有幾種我簡單梳理一下方便大家對照自己的場景選型。第一種叫分包方式也是最古老的做法。按照包名區(qū)分 dao 層接口比如com.example.mapper.mysql下的走 MySQL 數(shù)據(jù)源com.example.mapper.sqlserver下的走 SqlServer 數(shù)據(jù)源。每個數(shù)據(jù)源配置獨(dú)立的SqlSessionFactory各管各的包互不干擾。優(yōu)點(diǎn)是實(shí)現(xiàn)簡單、邏輯清晰問題是有多少數(shù)據(jù)源就要配置多少套 MyBatis 環(huán)境代碼一多維護(hù)成本就上來了而且一旦出現(xiàn)跨庫業(yè)務(wù)就得寫多套 Mapper 去拼裝數(shù)據(jù)。第二種是 AOP 自定義注解的方式。核心思路是定義一個DataSource注解標(biāo)注在 Service 或 Mapper 方法上通過切面在方法執(zhí)行前動態(tài)切換數(shù)據(jù)源執(zhí)行完再切回來。這種方式靈活度高可以做到按方法粒度控制數(shù)據(jù)源而且改造量相對小只要在需要切換的方法上加個注解就行。第三種是動態(tài)路由方式基于 Spring 提供的AbstractRoutingDataSource抽象類。它內(nèi)部維護(hù)一個目標(biāo)數(shù)據(jù)源的 Map通過determineCurrentLookupKey()方法動態(tài)決定當(dāng)前線程使用哪個數(shù)據(jù)源。配合 ThreadLocal 存儲數(shù)據(jù)源標(biāo)識就能實(shí)現(xiàn)運(yùn)行時的自由切換。我最終選的是方案二和方案三的結(jié)合基于AbstractRoutingDataSource做底層路由再封裝自定義注解和 AOP 切面做上層控制。這樣既能享受動態(tài)切換的靈活性又能通過注解讓業(yè)務(wù)代碼保持整潔。這也是目前大多數(shù)互聯(lián)網(wǎng)項目的通行做法如果你看過一些開源的多數(shù)據(jù)源框架比如dynamic-datasource-spring-boot-starter底層思路其實(shí)是一樣的。1.3 項目環(huán)境與版本信息做之前先把版本定下來避免后面掉進(jìn)版本兼容的坑里。我這次用的環(huán)境是組件版本JDK1.8SpringBoot2.3.7.RELEASEMyBatisPlus3.4.3.4MySQL5.7SqlServer2012Maven3.6.3這里提醒一句SpringBoot 版本別追太高。我見過有同事直接用 SpringBoot 3.x結(jié)果發(fā)現(xiàn)javax變成了jakarta很多老依賴都跑不起來。如果項目里還有歷史代碼建議先用 2.x 的穩(wěn)定版本把功能跑通。2. 靜態(tài)雙數(shù)據(jù)源配置從零開始接入 MySQL 和 SqlServer2.1 Maven 依賴引入的正確姿勢先把基礎(chǔ)依賴配好。除了 SpringBoot 和 MyBatisPlus 的常規(guī)依賴之外還需要把兩個數(shù)據(jù)庫的驅(qū)動都引進(jìn)來。這里有個容易踩的坑MySQL 驅(qū)動的 groupId 和 artifactId 在不同版本之間有變化mysql:mysql-connector-java是老坐標(biāo)com.mysql:mysql-connector-j是新坐標(biāo)別搞混了。dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.4.3.4/version /dependency dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version5.1.49/version /dependency dependency groupIdcom.microsoft.sqlserver/groupId artifactIdmssql-jdbc/artifactId version9.4.1.jre8/version /dependency dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependencySqlServer 驅(qū)動的版本選擇有個細(xì)節(jié)。mssql-jdbc的版本號后綴jre8表示支持 Java 8如果你用的 JDK 是 1.8選帶這個后綴的版本最穩(wěn)妥。如果項目用 JDK 11 以上可以選不帶后綴或帶jre11的版本。2.2 application.yml 配置兩個數(shù)據(jù)源的參數(shù)化配置依賴配好后就是寫配置。我習(xí)慣把數(shù)據(jù)源信息放在application.yml里動態(tài)配置這樣不同環(huán)境之間切換只需要改配置文件不用動代碼。spring: datasource: mysql: driver-class-name: com.mysql.jdbc.Driver jdbc-url: jdbc:mysql://localhost:3306/business_db?useUnicodetruecharacterEncodingutf-8useSSLfalse username: root password: root123 sqlserver: driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver jdbc-url: jdbc:sqlserver://192.168.1.100:1433;DatabaseNamehistory_db username: sa password: Sa123456注意這里的 key 是jdbc-url不是url。如果用urlSpringBoot 的自動配置會嘗試把它當(dāng)作默認(rèn)數(shù)據(jù)源來處理導(dǎo)致多數(shù)據(jù)源場景下的配置錯亂。這是我見過很多人踩過的坑寫的時候一定要看清。另外有個小細(xì)節(jié)每套數(shù)據(jù)源的driver-class-name必須明確指定不要依賴 SpringBoot 自動推斷。MySQL 8.0 以上版本驅(qū)動類名變成了com.mysql.cj.jdbc.Driver如果你用的是 8.x 驅(qū)動卻配了舊類名啟動時必報錯。2.3 數(shù)據(jù)源配置類手動裝配 SqlSessionFactory多數(shù)據(jù)源場景下需要手動創(chuàng)建數(shù)據(jù)源和SqlSessionFactory繞開 SpringBoot 的自動配置。這里以 MySQL 數(shù)據(jù)源為例Configuration public class DataSourceConfig { Bean(name mysqlDataSource) ConfigurationProperties(prefix spring.datasource.mysql) public DataSource mysqlDataSource() { return DataSourceBuilder.create().build(); } Bean(name sqlServerDataSource) ConfigurationProperties(prefix spring.datasource.sqlserver) public DataSource sqlServerDataSource() { return DataSourceBuilder.create().build(); } Bean(name dynamicDataSource) public DataSource dynamicDataSource() { DynamicDataSource dynamicDataSource new DynamicDataSource(); MapObject, Object dataSourceMap new HashMap(4); dataSourceMap.put(mysql, mysqlDataSource()); dataSourceMap.put(sqlserver, sqlServerDataSource()); dynamicDataSource.setTargetDataSources(dataSourceMap); dynamicDataSource.setDefaultTargetDataSource(mysqlDataSource()); return dynamicDataSource; } Bean(name sqlSessionFactory) public SqlSessionFactory sqlSessionFactory(Qualifier(dynamicDataSource) DataSource dynamicDataSource) throws Exception { MybatisSqlSessionFactoryBean sessionFactory new MybatisSqlSessionFactoryBean(); sessionFactory.setDataSource(dynamicDataSource); sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources(classpath*:mapper/**/*.xml)); return sessionFactory.getObject(); } }這里有幾個關(guān)鍵點(diǎn)。第一MybatisSqlSessionFactoryBean用的是 MyBatisPlus 自帶的類不是 mybatis 原生的SqlSessionFactoryBean這樣才能讓 MyBatisPlus 的分頁插件、邏輯刪除等功能生效。第二mapperLocations用classpath*通配符這樣多個數(shù)據(jù)源的 Mapper XML 文件可以放在不同子目錄下避免路徑?jīng)_突。第三dynamicDataSource作為唯一的數(shù)據(jù)源注入到 MyBatis 里所以最終所有 Mapper 操作的入口都是動態(tài)數(shù)據(jù)源由它在內(nèi)部做轉(zhuǎn)發(fā)。3. 動態(tài)數(shù)據(jù)源實(shí)現(xiàn)核心類與 AOP 自動切換3.1 AbstractRoutingDataSourceSpring 預(yù)留的擴(kuò)展點(diǎn)AbstractRoutingDataSource是 Spring 提供的一個抽象類它的核心作用就是做一個路由分發(fā)。你可以把它理解成一個中轉(zhuǎn)站它自己不是一個真正意義上的數(shù)據(jù)庫連接池而是維護(hù)著一組目標(biāo)數(shù)據(jù)源每次獲取連接的時候通過抽象方法determineCurrentLookupKey()來決定應(yīng)該返回哪個真實(shí)數(shù)據(jù)源的連接。實(shí)現(xiàn)起來很簡單public class DynamicDataSource extends AbstractRoutingDataSource { Override protected Object determineCurrentLookupKey() { return DataSourceContextHolder.getDataSourceKey(); } }關(guān)鍵是DataSourceContextHolder通常用 ThreadLocal 實(shí)現(xiàn)public class DataSourceContextHolder { private static final ThreadLocalString CONTEXT new ThreadLocal(); public static void setDataSourceKey(String dataSourceKey) { CONTEXT.set(dataSourceKey); } public static String getDataSourceKey() { return CONTEXT.get(); } public static void clear() { CONTEXT.remove(); } }為什么必須用 ThreadLocal因為 Spring 的DataSourceUtils在獲取連接的時候會先看當(dāng)前事務(wù)上下文里是否已有連接如果有就直接復(fù)用。ThreadLocal 能保證同一線程內(nèi)數(shù)據(jù)源切換在當(dāng)前線程內(nèi)是隔離的不會影響其他線程。但這也引出一個隱患——線程池復(fù)用問題后面我會在踩坑部分詳細(xì)說。3.2 自定義注解 DataSource光有路由還不夠得讓業(yè)務(wù)代碼能方便地指定數(shù)據(jù)源。我定義了一個注解Target({ElementType.METHOD, ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Documented public interface DataSource { String value() default mysql; }這個注解可以標(biāo)注在 Service 方法上也可以標(biāo)注在類上。標(biāo)注在類上表示整個類的所有方法默認(rèn)走某個數(shù)據(jù)源標(biāo)注在方法上則覆蓋類級別的配置。一個是粗粒度一個是細(xì)粒度兩者結(jié)合使用起來非常靈活。3.3 AOP 切面方法執(zhí)行前自動切換核心切面邏輯如下Aspect Component Order(1) public class DataSourceAspect { Pointcut(annotation(com.example.annotation.DataSource) || within(com.example.annotation.DataSource)) public void dataSourcePointCut() {} Before(dataSourcePointCut()) public void doBefore(JoinPoint joinPoint) { MethodSignature signature (MethodSignature) joinPoint.getSignature(); Method method signature.getMethod(); DataSource dataSource method.getAnnotation(DataSource.class); if (dataSource null) { dataSource joinPoint.getTarget().getClass().getAnnotation(DataSource.class); } if (dataSource ! null) { DataSourceContextHolder.setDataSourceKey(dataSource.value()); } } After(dataSourcePointCut()) public void doAfter(JoinPoint joinPoint) { DataSourceContextHolder.clear(); } }切面的Order(1)很重要。如果項目里同時有事務(wù)切面必須保證數(shù)據(jù)源切面的優(yōu)先級高于事務(wù)切面。原因在于Spring 的事務(wù)管理在開啟事務(wù)時就要確定使用哪個數(shù)據(jù)源如果事務(wù)切面先執(zhí)行它拿到的還是默認(rèn)數(shù)據(jù)源后面的切換就白做了。切面邏輯里有個細(xì)節(jié)within是用來匹配類級別注解的。我的切點(diǎn)同時寫了annotation和within這樣能兼顧方法級和類級的注解配置避免在使用類級注解時切面不生效的問題。4. 實(shí)操踩坑實(shí)錄MyBatisPlus 配合多數(shù)據(jù)源的高頻問題4.1 分頁插件配置問題單頁 500 條限制的真相先說說 MyBatisPlus 分頁的事。很多人在網(wǎng)上搜到MyBatisPlus 單頁 500 條限制其實(shí)這并不是框架硬編碼的限制而是分頁插件配置不到位導(dǎo)致的。老版本的 MyBatisPlus 分頁插件默認(rèn)有l(wèi)imit保護(hù)不配置的話某些版本會限制單頁查詢條數(shù)。正確配置方式是在 MyBatisPlus 的配置類里添加分頁插件Configuration public class MybatisPlusConfig { Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); PaginationInnerInterceptor paginationInnerInterceptor new PaginationInnerInterceptor(); paginationInnerInterceptor.setMaxLimit(500L); paginationInnerInterceptor.setOverflow(false); interceptor.addInnerInterceptor(paginationInnerInterceptor); return interceptor; } }這里setMaxLimit(500L)就是網(wǎng)上說的單頁 500 限制的源頭。如果不希望限制單頁大小可以把這個值設(shè)大或者不設(shè)置。但我要提醒一句這個限制其實(shí)是好心防止有人寫LIMIT 1000000這種查詢把數(shù)據(jù)庫打掛。生產(chǎn)環(huán)境建議保留只是結(jié)合實(shí)際業(yè)務(wù)把閾值調(diào)到一個合理的值。另外一個更隱蔽的問題是在多數(shù)據(jù)源場景下MySQL 和 SqlServer 的分頁語法不一樣。MySQL 用LIMIT ? OFFSETSqlServer 2012 以上用OFFSET ? ROWS FETCH NEXT ? ROWS ONLY。如果只給 MyBatisPlus 配置了 MySQL 方言的分頁插件切到 SqlServer 后分頁邏輯就會出錯。好在 MyBatisPlus 的PaginationInnerInterceptor是支持多方言的它會根據(jù)當(dāng)前數(shù)據(jù)源的類型自動選擇合適的方言。但這要求你的多個數(shù)據(jù)源必須都注冊到同一個 MyBatis 環(huán)境里而不能拆成多個SqlSessionFactory否則多方言識別就失效了。4.2 關(guān)鍵字沖突表名和字段名的那些坑SqlServer 有一些保留關(guān)鍵字是 MySQL 里可以隨便用的比如order、user、group、index等。我在項目里就碰到過一張 SqlServer 的歷史表字段名叫index在 MySQL 里這個字段名完全合法在 SqlServer 里必須加方括號才能查。MyBatisPlus 提供了全局的關(guān)鍵字自動轉(zhuǎn)義開關(guān)mybatis-plus: global-config: db-config: column-format: %s但這個配置只對 MySQL 的反引號有效。如果同時操作 SqlServer反引號就不認(rèn)了。更穩(wěn)妥的做法是在實(shí)體類的TableField注解上手動指定別名TableField(index) private Integer index;如果是 SqlServer需要寫成TableField([index]) private Integer index;這種問題防不勝防尤其是接手老數(shù)據(jù)庫的時候。我的建議是先用工具連上 SqlServer把涉及的表結(jié)構(gòu)和字段整體瀏覽一遍建一個關(guān)鍵字清單寫 Mapper 的時候?qū)φ罩幚韯e等到運(yùn)行時報錯了再回頭一個個查。4.3 事務(wù)與數(shù)據(jù)源切換的沖突這個坑非常典型。場景是這樣的有一個方法需要先查 SqlServer 的數(shù)據(jù)再做業(yè)務(wù)處理最后寫 MySQL。一開始我直接在方法上加了Transactional然后通過 AOP 切數(shù)據(jù)源結(jié)果發(fā)現(xiàn)第二個操作還是走的老數(shù)據(jù)源。原因一句話說清楚事務(wù)開啟時數(shù)據(jù)源就已經(jīng)固定了。Transactional是在方法進(jìn)入前就通過事務(wù)管理器獲取了連接后續(xù)的數(shù)據(jù)源切換只是在DataSourceContextHolder里改了 ThreadLocal 的值但事務(wù)上下文里持有的連接還是老數(shù)據(jù)源的那個切不過去。解決辦法有這么幾種第一種業(yè)務(wù)允許的情況下把跨數(shù)據(jù)源的操作拆成兩個方法分別加事務(wù)通過調(diào)用另一個 Service 的方法來完成。這是最省事的辦法。第二種使用分布式事務(wù)方案比如 Seata、Atomikos但引入成本較高小項目沒必要。第三種也是最常用的用編程式事務(wù)替代聲明式事務(wù)Autowired private TransactionTemplate transactionTemplate; public void crossDataSourceOperation() { DataSourceContextHolder.setDataSourceKey(sqlserver); Object result queryFromSqlServer(); DataSourceContextHolder.clear(); transactionTemplate.execute(status - { DataSourceContextHolder.setDataSourceKey(mysql); try { insertToMysql(result); return true; } catch (Exception e) { status.setRollbackOnly(); throw e; } finally { DataSourceContextHolder.clear(); } }); }這樣每個數(shù)據(jù)源的操作在自己的事務(wù)模板里管理互不干擾。但跨數(shù)據(jù)源的數(shù)據(jù)一致性就只能靠業(yè)務(wù)補(bǔ)償來保證了這也是多數(shù)據(jù)源方案天然的限制。4.4 連接池配置多個數(shù)據(jù)源各自為戰(zhàn)連接池這塊也容易出問題。默認(rèn)情況下SpringBoot 2.x 會使用 HikariCP 作為連接池。多數(shù)據(jù)源時每個數(shù)據(jù)源應(yīng)該有自己的連接池配置避免共用一個連接池導(dǎo)致連接耗盡。spring: datasource: mysql: hikari: minimum-idle: 5 maximum-pool-size: 20 connection-timeout: 30000 sqlserver: hikari: minimum-idle: 3 maximum-pool-size: 10 connection-timeout: 15000SqlServer 的連接池大小不用配得跟 MySQL 一樣大。因為 SqlServer 在老系統(tǒng)里主要用于查詢歷史數(shù)據(jù)并發(fā)量相對較低配小一點(diǎn)可以節(jié)省資源。同理超時時間也可以設(shè)置短一些避免 SqlServer 響應(yīng)慢的時候拖垮應(yīng)用線程。4.5 SqlServer 排序規(guī)則沖突問題網(wǎng)上有個熱詞是sqlserver cannot resolve the collation conflict翻譯過來就是排序規(guī)則沖突。這個問題出現(xiàn)在 SqlServer 的臨時表關(guān)聯(lián)查詢時如果兩個表的排序規(guī)則比如Chinese_PRC_CI_AS和SQL_Latin1_General_CP1_CI_AS不一致關(guān)聯(lián)查詢會報錯。在多數(shù)據(jù)源場景下如果我們從 MySQL 同步數(shù)據(jù)到 SqlServer再臨時建表去關(guān)聯(lián)歷史表很容易觸發(fā)這個問題。解決辦法是建臨時表時顯式指定排序規(guī)則CREATE TABLE #temp_table ( user_name NVARCHAR(50) COLLATE Chinese_PRC_CI_AS )或者在關(guān)聯(lián)時用COLLATE強(qiáng)制指定SELECT * FROM table_a a INNER JOIN table_b b ON a.name b.name COLLATE Chinese_PRC_CI_AS這個坑可能隱藏得比較深我遇到過因為排序規(guī)則不一致導(dǎo)致的慢查詢排查了很久才發(fā)現(xiàn)是隱式轉(zhuǎn)換導(dǎo)致索引失效。4.6 SqlServer 字符串轉(zhuǎn)數(shù)字多數(shù)據(jù)源下的數(shù)據(jù)類型兼容SqlServer 里把字符串轉(zhuǎn)數(shù)字常用CAST或CONVERTSELECT CAST(123 AS INT) SELECT CONVERT(INT, 123)MySQL 則用CAST(123 AS SIGNED)或者直接123 0。如果項目里有共用 Mapper XML不同數(shù)據(jù)庫的轉(zhuǎn)換語法就得分別寫不能混用。我的做法是把這類數(shù)據(jù)庫相關(guān)的 SQL 拆到各自的 Mapper 里通過數(shù)據(jù)源切換來保證執(zhí)行正確。另外要注意 SqlServer 的CAST轉(zhuǎn)換失敗會直接報錯不像 MySQL 在某些模式下會有寬松處理。生產(chǎn)環(huán)境如果遇到臟數(shù)據(jù)字符串里有空格或特殊字符轉(zhuǎn)換就會炸。建議先用ISNUMERIC判斷一下SELECT CASE WHEN ISNUMERIC(column_name) 1 THEN CAST(column_name AS INT) ELSE 0 END FROM table_name5. 多數(shù)據(jù)源方案驗證與優(yōu)化建議5.1 單元測試怎么寫才靠譜數(shù)據(jù)源切換這種邏輯一定要寫測試驗證不能等上線了再看效果。我用 SpringBootTest 寫了幾組測試用例覆蓋不同場景的切換邏輯。SpringBootTest RunWith(SpringRunner.class) public class DataSourceSwitchTest { Autowired private UserService userService; Test public void testQueryMysqlUser() { User user userService.getUserFromMysql(1L); Assert.assertNotNull(user); } Test public void testQuerySqlServerUser() { User user userService.getUserFromSqlServer(100L); Assert.assertNotNull(user); } Test public void testSwitchBetweenDataSources() { User mysqlUser userService.getUserFromMysql(1L); User sqlServerUser userService.getUserFromSqlServer(100L); Assert.assertNotNull(mysqlUser); Assert.assertNotNull(sqlServerUser); } }注意測試方法的執(zhí)行順序。JUnit 默認(rèn)的方法執(zhí)行順序是不固定的如果測試類里多個方法都在切換數(shù)據(jù)源ThreadLocal 里的值可能在方法結(jié)束后由After清理一般不會互相影響。但如果某些測試并發(fā)執(zhí)行異常可能會出現(xiàn)數(shù)據(jù)源串了的情況。穩(wěn)妥起見每個測試方法都從默認(rèn)狀態(tài)開始不依賴前一個方法的執(zhí)行結(jié)果。5.2 多數(shù)據(jù)源下的性能優(yōu)化多數(shù)據(jù)源不只是配置問題性能同樣要關(guān)注。幾個實(shí)測經(jīng)驗第一連接池參數(shù)要分別調(diào)優(yōu)。MySQL 作為主庫讀寫頻繁最大連接數(shù)可以設(shè)置得高一些SqlServer 作為輔助庫查詢量大但并發(fā)不高連接數(shù)可以少一些。第二跨數(shù)據(jù)源的循環(huán)查詢要避免。比如先查 SqlServer 拿到 1000 條記錄然后再循環(huán)查 MySQL 補(bǔ)充信息這種寫法性能極差。正確做法是把 SqlServer 查出來的 ID 集合一次性傳給 MySQL用IN查詢批量處理。第三如果查詢的數(shù)據(jù)量比較大利用好索引。SqlServer 老表的索引往往不夠優(yōu)化必要時可以創(chuàng)建覆蓋索引來加速常用查詢。但 DDL 操作要謹(jǐn)慎避免高峰期執(zhí)行。5.3 從 MyBatis 到 MyBatisPlus 的兼容保障項目里既有 MyBatis 的 XML 寫法也有 MyBatisPlus 的 Wrapper 寫法。多數(shù)據(jù)源下這兩種寫法都需要保證切換正常。我踩過的一個坑是在某個自定義 SQL 里用了${ew.customSqlSegment}結(jié)果 MyBatisPlus 的多表查詢沒有自動帶上數(shù)據(jù)源切換邏輯導(dǎo)致部分?jǐn)?shù)據(jù)查不到。這個問題的根源在于MyBatisPlus 的 Wrapper 條件構(gòu)造器在生成 SQL 時對IN類型的條件會有數(shù)量限制的優(yōu)化邏輯。對于超過 1000 條的IN查詢MyBatisPlus 會做拆分處理但這個拆分后的 SQL 執(zhí)行順序可能與數(shù)據(jù)源切換順序不一致。解決方案是手動把IN查詢拆分為多個小批次避免單條 SQL 過大。另外如果要在 MyBatisPlus 中使用自定義 SQL 并拼接 Wrapper建議用${ew.customSqlSegment}時注意轉(zhuǎn)義問題尤其是字段名包含關(guān)鍵字時要在注解或 XML 里確認(rèn)最終 SQL 的正確性。6. 常見問題速查表與排查技巧6.1 問題匯總癥狀可能原因解決辦法啟動報DataSource循環(huán)依賴多個數(shù)據(jù)源的 Bean 互相引用用Primary指定主數(shù)據(jù)源或在配置類中通過Qualifier明確注入切換數(shù)據(jù)源不生效AOP 切面沒有攔截到方法確認(rèn)自定義注解是否標(biāo)在 Service 方法上Order(1)是否配置事務(wù)方法內(nèi)切換數(shù)據(jù)源失敗事務(wù)開啟時連接已鎖定拆分方法或使用編程式事務(wù)SqlServer 查詢報錯字段名是保留字用方括號括起來MyBatisPlus 分頁在 SqlServer 下失效方言識別失敗PaginationInnerInterceptor注冊后確認(rèn)多數(shù)據(jù)源共享同一個SqlSessionFactory連接池報Connection is not available連接泄露或配置過小檢查連接池配置用SELECT * FROM sys.dm_exec_connections之類的語句排查6.2 排查思路與調(diào)試技巧多數(shù)據(jù)源問題排查第一步永遠(yuǎn)是確認(rèn)當(dāng)前線程的數(shù)據(jù)源是什么。我一般在DataSourceAspect里加一行日志log.info(switch datasource to{}, dataSource.value());然后觀察日志輸出是否與預(yù)期一致。如果日志顯示已切換但查詢還是走的老庫那問題大概率出在事務(wù)上如果日志都沒打印那就是 AOP 切面沒起作用需要檢查注解位置和 Spring 掃描路徑。第二個技巧是打開 HikariCP 的連接獲取日志通過監(jiān)控連接池的活動情況來判斷數(shù)據(jù)源是否正確。在application.yml里配置logging: level: com.zaxxer.hikari: DEBUG這樣可以看到每次獲取連接來自哪個數(shù)據(jù)源、連接池的活躍數(shù)是多少對定位連接泄露和切換異常都很有幫助。第三個技巧是查看 MyBatis 的執(zhí)行日志。MyBatisPlus 提供了 SQL 輸出日志可以配置輸出 SQL 內(nèi)容確認(rèn)執(zhí)行的 SQL 語句是否符合當(dāng)前數(shù)據(jù)源的方言。如果 SQL 語法是 MySQL 的但執(zhí)行到了 SqlServer 上基本可以斷定是數(shù)據(jù)源切換出了問題。6.3 后續(xù)擴(kuò)展動態(tài)加數(shù)據(jù)源、分布式事務(wù)如果項目后續(xù)要接入更多數(shù)據(jù)源比如再加一個 PostgreSQL只需要在DataSourceConfig中添加一個新的數(shù)據(jù)源 Bean然后在dynamicDataSource中把它put進(jìn)targetDataSources即可。但要注意如果數(shù)據(jù)源是運(yùn)行時動態(tài)增加的比如多租戶場景需要調(diào)用AbstractRoutingDataSource的afterPropertiesSet()方法來刷新配置。分布式事務(wù)是個更深的話題。如果業(yè)務(wù)上真的需要跨庫的強(qiáng)一致性比如一個操作既要寫 MySQL 又要寫 SqlServer多數(shù)據(jù)源方案已經(jīng)解決不了問題了得引入分布式事務(wù)中間件。我的建議是盡早評估業(yè)務(wù)場景如果只是簡單的查詢和異步補(bǔ)償多數(shù)據(jù)源方案完全夠用如果要做強(qiáng)一致的跨庫寫操作提前設(shè)計好技術(shù)選型不要等寫完了再返工。我在實(shí)際項目中的體會是多數(shù)據(jù)源本身并不復(fù)雜復(fù)雜的永遠(yuǎn)是業(yè)務(wù)邊界和異常處理。動手之前先想清楚哪個庫是主、哪個庫是輔在代碼層面規(guī)定好數(shù)據(jù)源的使用規(guī)范比什么花哨的框架都重要。最后再分享一個平時容易忽略的小細(xì)節(jié)如果你的項目在部署時切換了環(huán)境記得檢查數(shù)據(jù)庫連接串和賬號權(quán)限我遇到過多次因為新環(huán)境 SqlServer 登錄賬號缺少VIEW SERVER STATE權(quán)限導(dǎo)致連接池初始化異常的案例這類問題一般不報錯清楚排查起來比較費(fèi)勁提前做好環(huán)境檢查能省不少事。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
99视频网| 秋霞成人毛片一级A片| 国自产拍偷拍精品啪啪一区二区 | 丁香婷婷影院| 超碰大香蕉网| 五月丁香婷婷三级| 人妻中文在线| 婷婷色五月丁香六月欧美啪| www婷婷| 99热手机在线精品| 五月天久久网站| 一区二区乱码视频| 青吴乐视频| 五月婷在线| 婷婷色网| 国产婷婷综合在线免费视频| 婷婷干| 久超超碰| 99无码黄色视频| 国产免费一区二区三州老师F1F1| 精品久9| 久久综合五月天| www,8050,午夜三级| 九月色婷婷婷| 大香伊人久色| 26uuu国产| 伊人丁香花综合影院| 另类五月激情| 色婷婷a三区麻| 超碰AV在线| 嫩BBB槡BBBB搡BBBB| 亚洲色在线观看| 久久久人妻人伦| 超碰在线资源| 欧美十二区| 日韩久热| 91丨九色丨熟女丰满| 五月六月丁香婷婷在线观看| 性生活视频98791| 成人片在线播放| 九九激情| 天天干天天日天天操| 婷婷激情伍月网| 日本丰满久久| 97婷婷丁香五月综合| 激情丁香淫荡婷婷| 国产中文亚洲欧美日韩性交| 久久艹99| Av九九| 丁香久久激情俄| 欧美色综合天天久久综合精品| 991精品在线视频| 九九热只有精品| 激情综合综合综合| 日韩一区二区三区无码| 亚洲激情图文小说| 五月天色婷婷av| 亚洲丁香花色| 99re最新地址视频| 欧美成人无码高清一区二区三区| 五月天天丁香婷婷在线中| 91seav| 懂色av蜜臀av粉嫩av永陈冠希| 99热午夜精品| 91主播在线| 天天做天天双| 五月丁香色五月| 亚洲激情AV| 久久久97| 婷丁五月| 国产一二三四五六七八视频| 婷婷五月激情视频在线| 婷婷色五月开心五月| 久久人妻乱| 婷婷色天香| 五月婷婷 欧美| 天天爽在线视频| 亚洲欧美婷婷五月色综合| 日韩在线视频中文字幕| 婷婷五月天视| 996日日爱| 天天综合影院| 中文字幕人妻在线| 久热这里只有精品性色AV| 大香蕉九九热| sS丁香五月婷婷| 操笔无码| 六月丁香VA| 狠狠色噜噜色狠狠狠综合久久成人波 | 九七色色六月丁香| 伊人久久大香天蕉亚洲特级| 91超碰在线观看| 思思热这里只有精品视频666| 久久激情视频| 色婷婷五月天天天干天天操天天爽| AV电影在线播放| 超碰免费在线| 人人爱人人添| 天天干狠狠| 99久久网站| 丁香五月激情站| 午夜爱爱爱成人| 伊人99热| 婷婷五月天激情五月天| 香蕉综合网| 中文字幕在线免费观看视频| av五月丁香| 超碰高清在线| 入口五月婷婷六月香| 亚洲综合网激情小说| 婷婷亚洲在线| 这里只有精品免费视频| 狠狠爱婷婷五月天| 日本女va| 六月婷婷久久| 天天色中文字幕女优AV| 五月婷婷另类| 99在线观看视频| 色情综合| 狠爱婷色| 日本成人小说婷婷六月| 亚洲午夜AV| 五月天激情AAAA| 天天骑天天操| 婷婷婷狠狠| 五月激情婷婷综合| 日本五月婷婷| 精品一区二区三区免费毛片爱| 婷婷激情久久| 久久久久综合激动五月天| 亚洲亚洲永久无码777777| 久久综合丁香| 日韩色色色色| 九九九九九无码| 婷婷综合色五月天| 久久R激情| 九九这里是免费的视频5| Va另类视频| 国产免费AV网站| 五月伊人91| 婷婷天堂综合| 97热精品| 在线观看免费狠狠色丁香香综合| 一本婷婷丁香久久| 中文字幕综合网| 亚洲 无码 中文字幕 中出| 九九色综合网| 天天综合 99久久婷婷| 色亚洲婷婷| YJLZZJLZZ亚洲乱熟无码| 99燥99日| Jh7Uf088VHafNm| 超碰久热| 五月丁香婷婷爱激情综合网| a在线观看| 综合激情四射一theav| 丁香香五月激情免费视频| 久久婷婷五月天激情四射| 亚洲正能量欧美| 操人久久| 五月天伊人网| 色婷丁香五月| 天天天天操| 激情五月天色网站| 婷婷丁香午夜综合影视| 色色热| 9色在线| 综合伊人狠狠| 色很久综合| 激情综合网,婷婷五月天| 97人人草| 99热99热| 九九热99熟女| 激情五月五月婷婷| 91操色| 9热精品| 日本激情91| 99操免费视频| 五月天无码| www.丁香五月| 欧美猛片| 秋霞AV美国| 色五月婷婷基地| 久久久潮喷-久久久九九-成人AV| 可以免费观看的AV| 亚洲国产精品成人免费一区久久久在线观看AAAA | 久九男女天堂| 综合五月网| 婷婷五月天AV在| 日本色爽| 六月丁香婷婷综合色播| 操逼五月婷婷| 色综合大香蕉| 色色影院aaaav| 国产AV一区二区三区日韩| 亚洲精品性色| av在线播放网址| 99热精品观看| 五月丁综合在线观看| 色呦精品| 久久五月天激情美女| 狠狠干五月天| 久久香蕉影院| 日韩无码专区| 五月丁香六月色婷婷| 99色在线| 久久草人妻| 日韩超碰在线| 午夜天堂一区人妻| 99热这里只有精| 在线成人网站| 九色综合五月天婷五月| 午夜成人AV在线| 色播五月婷婷综合| 久久天堂精品| 超碰在线caop| 91男同| 亚洲第一色网站| 成人av在线网| 99热这| 天天综合图片| 五月婷婷色情| 爱狠射| 五月天综合色| 婷婷五月综合网| 久久亚洲网| 九九色婷婷Av| 亚洲乱码日产精品BD| 五月婷婷激情网| 丁香五月自拍| 五月丁香亭亭操逼| 激情五月www| 久婷婷五月综合欧美| av在线资源| 五月激情婷婷在线| 婷婷基地五月色| 天堂中文国产| 久久9RE热视频精品98| www.婷婷| 五月花激情| 亚洲天堂热| yw国产AV| www.丁香六月婷婷久久天堂影院.con| 青青草成人网| 激情视频网址| 高清不卡一区| 秋霞AV淫| 98色花堂98t.R| 天天成人丁香美女AV| 五月丁香激情啪啪| 激情黄色小说色五月| 婷婷五月天精品| 99热99网| 99久久久国产大片| 久久久中文| 97久操视频| 婷婷丁香五月社区亚洲| 五月天操逼激情| 五月激情综合网| 色欲色香综合网| 无码G高清天| 日韩久久视频| 久久婷婷亚洲| 99热 这里只有精品 国产 日韩| www.com任你艹| 1024成人免费看| 在线观看免费视频| 九九亚洲天堂| 一级内射毛片| 人人操大| 97色女人在线| 色五月激情综合网| 99精品视频免费在线播放| 六月婷欧美| 婷婷五月婷婷| 国产午夜精品一区二区| 丁香婷婷六月天| 丁香婷婷六月男男| 亚洲操精品| 婷婷六月天激情| 五月天婷婷人妻| 五月天激情无码高清| 狠色狠色狠色狠色狠色网| 五月天激情综合网站| 婷婷综合色图| 成人做爰A片免费看网站找不到了| 中文资源在线a| 中文字幕AV网址| 丁香婷婷色| 色人久夂| 99热这只有| 人人操Av| 丁香五月婷婷色| 成人性爱无码| 棕合影院色色| 香蕉综合网| 九九热免费视频| 色高清无码视频| 米奇影视资源777狠狠色婷婷五月天激情网 | 欧美亚洲999| 婷婷欧美色| renrencaoni| 五月亭亭激情综合| 五月天色综合| 97色碰| 中文字幕无码AV| www.亚洲激情.com| 色999五月色| 婷婷五月天视| 亚洲激情免费视频观看| 婷婷五月婷婷| 欧美婷婷综合| av九九| 人妻内射麻豆视频| 丁香六月婷婷| 午夜天堂一区人妻| 中美日韩成人在线| 丁香五月五婷| 欧美性爱五月天| 91人妻视频| 色丁香影院| 色婷婷综合亚洲| 丁香六月婷婷久久综合| 激情熟女网| 色五月丁香五月五月婷婷| 婷婷六月花| 91超碰在线观看| 中文字幕无码人妻少妇免费视频| 婷婷伊人75| 天天在线久久综合| 亚洲高清在线| 五月天堂色色| 亚洲综合色五月| 成人婷婷| ady狠狠入| 五月丁香六月综合情在线观看 | 欧美va国产va| 亚洲操逼网| 久久九九热re6这里有精品| 激情五月婷| 开心五月综合激情综合五月| 91色久| 色婷婷AⅤ| 国产内射婷婷| WWW丁香五月| 日本色爽| 欧美婷婷九月| 人人爱人人添| 天天揷综合网| 天天做天天爰天天爽天天无遮挡| 色婷婷九月| 99热在线观看| 五月丁香直播| 婷婷综合五月天| 丝袜激情网| 激情五月婷婷色| 无码99| 91大神操美女| 久久五月婷婷丁香| 97干在线看| 五月天婷婷导航| 九九热re99re6在线精品| 极品人妻VIDEOSSS人妻| 激情综合网婷婷久久| 91超碰在线观看| 日韩有码久久| 综合婷婷五月天| 五月丁香成人视频| 五月天堂六月丁香亚州中文字幕久久 | 亚洲第一视频 久久| 五月激情视频| 99热免费网站| 九九在线视频| 成人色情五月天婷婷丁香| 夜夜操狠狠操| 99'无码| 五月天社区| 五月婷在线影院| 五月天成人在线播放| 9l视频自拍九色9l黑人| 夜夜骑夜夜撸| 狠狠色色综合| 97碰碰视频在线观看| 91精品综合久久婷婷九色| 色五月激情五月天| www91精品| 色五月婷婷五月天| 97狠狠色| 五月天伊人| 99热成人精品| 26uuu成人网| 日本成人小说婷婷六月| 久热AⅤ| 亚洲第一精品网站| 久久性刺激| 日韩成人网址| 天天久久综合| 五月婷婷成人| 婷婷爱五月天| 日逼免费视频| 五月天婷婷色情| 激情综合99| 五月丁香婷婷久久| 成人综合网站| 天天色天天| www.色综合.com| 五月婷婷之综合激情| 思思视频精品| 欧洲区自拍| 9久国产精品| 亚洲日韩国产黑丝黑丝AVAV一区二区三区| 国产肥白大熟妇BBBB视频| www激情网| 97狠狠碰| 色一情一乱一乱一区91Av| 五月天色婷婷小说| 久久婷婷五月综合啪| 欧美黄色AA片哗啦啦啦| 狠狠色狠狠色综合日日91| 激情综合在线播放| 五月天综合| 性色99| 色情婷婷。| 亚洲精品亚洲人成人网| 日日爽日日| WWW.天天日| 色吧婷婷五月亚洲| 色99在线| 99热这里只有精品1| 婷婷伊人綜合中文字幕| 涩玖玖免费视频| 大香蕉综合网| 婷婷五月情| 狠狠操天天操| 五月综合激情| 九色视频入口91| 丁香五月播播| 开心五月深爱五月| 婷婷网五月| 99热这里只有精品1025| 人人草碰| 婷婷在线五月综合| 99久久久久| 思思热视频在线观看| 色婷婷中文字母五月丁香| 婷婷丁香色性爱| 精品一二三区久久AAA片| 婷婷婷婷婷婷婷婷| 天天色色婷婷| 天天狠狠插| 五月婷婷啪啪啪| 丁香五月婷婷综合激情哟哟哟| 成人av免费观看| 天天干天天干天天干天天干天天| av大香蕉| 日韩无码成人电影| 免费亚洲成人电影AV| 91久久精品国产91性色TV| 97香蕉碰碰人妻国产欧美| 久久机热这里只有精品| 九九热这里只有精品23| 99爽视频| 97性视频| 丁香五月AV| www亚洲无码| 亚洲综合五月天婷婷| 色五月天婷婷| 亚洲综合在线视频| 开心激情网在线| 色婷婷五月天偷拍| 老司机伊人| 丁香五月天BBw| 五月丁香成人日| 天天色天天搡| 久久天天天| 五月天激情网址| 操婷婷久久| 9999热免费视频视频| 日韩AV免费看| 婷婷99视频全集高清| 免费无码毛片一区二区A片 | 七七九九色色| 欧美综合婷婷欧美综| www.五月天婷婷.com| 婷婷丁香五月天哟啪| 五月丁香精品| 色色99| 在线另类| 99激情视频热| 天天拍久久| 最新亚洲色色网| 人人干Av| 天天插天天射| 91久久久久久| 欧美大肥婆大肥BBBBB| 丁香婷婷啪啪| 亚洲蜜桃精久久久久久久久久久久| 99热超碰在线| 婷婷五月花.97| 1024国产在线| 岛国午夜视频| 亚洲精品视频在线播放| 开心 五月 综合| 色综合色欲综合天天免费| 26UUU亚洲欧美| 五月婷婷在线观看| 欧美色性色好| 日韩aaa| 国产看真人毛片爱做A片| 久久视频在线视频| 日本在线观看aaa 99| 丁香 亚洲 久久| 在线网黄| 99精品在| 丁五月激情视频免费| 久久网日本| 色人久久| 99人妻碰碰碰久久久久| 五月丁香日本片| 提提热五月天婷婷| 五月婷婷五月天| 婷婷中文字幕| 五月综合激情网| 9l视频自拍九色9l视频在线观看| 亚洲色色色色色| 开心五月婷婷激情网| 久久99网| 另类少妇人与禽zOZZ0性伦| 色婷婷av综合网| 亚洲99综合| 五月婷婷中文网| 久久精彩免费视频| 日韩少妇内射免费播放| 九月婷婷色色| 久热这里只有精品66| 丁香五月五婷| 五月婷在线| 激情电影五月婷婷| 都市激情蜜桃婷婷五月天| 深爱激情网综合| 五月丁香黄色视频| 五月丁香中文婷婷中文| 激情婷婷综合| 91人人爽狠狠狠| 色婷网站| 色婷婷综合久色AV五色最新| 狠狠狠狠狠干| 久久99大| 五月 丁香 欧美| 色五月婷婷91| 97涩婷婷婷婷基地| 婷婷五月免费观看| 色综合99| 丁香五月天.com| 天天日,夜夜爽| 97人人操人人爽| 亚洲天堂制| 日本本土色网第一区| 婷婷五月天美女视频| 国产成人亚洲综合A∨婷婷| 久久影视婷婷五月| 开心五月深爱婷婷| 丁香花大香蕉婷婷综合| 五月婷久久| 五月丁香啪啪啪啪| 亚洲无码yw| 久久这里只有欧美| 激情五月丁香五月综合| 综合狠狠五月婷婷| 大香蕉啪啪啪| 国产99美少妇| 99这里只有精品|v| 91视频久久久| 这里只有精品在线视频在线观看| 丁香av网| 丁香五月另类小说在线阅读| 91啪啪视频| 久久网日本| 色五月激情网| 国产精品人妻在线网址| 永久精品| 丁香五月天激情四射网| 欧美性爱五月天| 激情五月婷婷色色| 欧美色色网| 婷婷丁香综合色AV| 色播激情| www.婷婷五月| 无码橾| 五月草视频| 超级碰 久久9| 六月婷婷综合| www.婷婷亚洲基地| 天天爽夜爽| 成人色五月天婷婷| 久久精品99国产精品日本| 99在线观看视频精品| 99久久婷婷国产综合| 五月丁香啪啪网| 色综合天天综合成人网| 久久一热免费视频| 国产AV一区二区三区最新精品| 开心丁五月| 亚洲无AV在线中文字幕| 五月婷久久在线| 精品国产a| 噜噜狠狠色综合久| 国产免费一区二区在线A片视频| 婷婷深爱色五月| 97婷婷狠狠久久综合9色| 丁香五月天婷婷中文字幕| 六月婷婷九月丁香| 99精品免费视频| 日日做夜夜爱| 狠狠干狠狠操狠狠爱| 久久91久久精品久久| 天天插天天插| 激情精品久久| 国产密乳av一区二区三区四区| 伊人无码高清| 亚洲婷婷五月天在线激情综合网| 亚洲国产精品SUV| 五月婷婷视频ab| AV在线收看| 久热无码| 天天精品视频在线观看视频| 婷婷色五月激情强奸四射| 久久综合人妻| 亚洲黄色网址| 五月丁香在线观看| 天天爽成人综合网站| 色色色综合网| 五月色综合网| 蜘蛛女免费观看完整版高清电影| 色天使色综合| 亚州色色色| 色丁香五月综合网| 在线99热| 欧州婷婷五月天综合| 噜噜狠狠色综合久| 亚洲五月综合色播| 91在线日| 五月婷婷综合色啪首页| 夜夜谢天天干| 婷婷五月天电影网| 天天做天天要天天爽| 欧美色色色色色色| 国产精品天天狠天天看| 中文AV在线播放| 天天操天天日天天爽| 丁香五月激情棕合| 玖玖九九9999在线观看视频精品| 开心五月网 | 亚洲成人无码网站| 激情四射亚洲| 琪琪理论片| 在线99精品| 老美AA片| 日本丁香五月| 婷婷五月色天| 婷婷激情五月综合丁香社| 亚洲欧洲另类| 色v综合网| 欧洲综合一区| 内射在线CHINESE| 欧美性爱中文字幕| 色欲色香综合网| 天天 日综合| 亚洲成人网在线观看| 中文在线视频久9| 丰满老熟妇BBBBB搡BBB| 亚洲婷婷五月天| 最新丁香六月婷婷| 国产在线另类五月婷婷| 欧美黑人大吊| 欧美精品999| av在线免费播放观看| 99性爱视频| 五月激情婷婷丁香| 日韩亚洲视频| 操一区| 婷婷五月综合色拍| 91肏| 亚洲精品国产setv| 九九大香蕉黄色影院| www,色色色网站| 日撸夜撸日操| 婷婷五月天成人综合网| 五月婷婷插一插| 无码中文一区二区三区| 天天爱天天做天天舔| 精a品a视a频| 婷婷激情伍月网| 亚洲AV网站| 五月丁香婷婷基地| 九九av| 无码人妻激情| 99A级片| 操婷婷久久| 九一牛视频探花| 五月色婷丁香| 97色啪| 婷婷九九| 婷婷欧美色| 狠狠 婷婷| 日日做天天操夜夜爽| www,婷婷五月天,com| 天天干天天叉| 婷婷性福五月天| 亚洲综合无码| 色婷婷五月天| 国产精品天天狠天天看| 日本nghangse中文字幕| 操比激情五月综合| 色婷婷手机在线| 激情五月婷婷网在线观看| 这里只有精品99www| 日本不卡五月婷婷丁香| 丁香五月婷婷在线视频| 婷色五月天| 九九久热| 五月天激情影院| 91丨九色丨东北熟女| 久久婷婷七月丁香| 国产婷婷综合| 综合在线网| 五月成人网天天| 激情久久丁香| 亚洲精品久久久久久久久久吃药| 777精品久无码人妻蜜桃| 久久综合婷婷激情| 五月天久久www| 成人五月天色天堂| 日本五月天一页| 91精品久久久久| 中文中文在线| 操比激情五月综合| 婷婷五月开心中文字幕色| 99热精品在线播放| 色五月天在线观看| 大香久久综合网| 成人亚洲精品| 色情五月天婷婷| 超碰色综合| 99噜噜噜在线播放| 伊人影院久久网| 91超级碰| 五月婷av| 婷五月丁香| 丁香六月久久| 欧美三级巜人妻互换| 玖玖午夜视频| 久久机热这里只有精品| 91五月天| 中文字幕亚洲-区久久99婷婷| 综合97五月| 婷婷丁香五月天激情| 无码色| 9久久婷婷国产综合精品性色| 色色色精品无码区| 欧美三日本三级少妇三99| 日本黄色三级片内射| 久久婷视频| 婷婷五月天激情影片| 99免费在线| jiujiuxiangjiaowang| 久热99| 五月婷婷六月激情| 97精品人人A片免费看| www.久久久久久久| www.99热视频| 天天综合精品| 我爱大香蕉| 久久精彩视频| 婷婷五月综合丁香久久| 色天天久婷婷| 99色视频| 99ri久久| 国产精品视频免费看| 久久综合九色综合88i| va中文资源在线观看| 婷婷久久五月天| 九九99热| 精品亚洲国产成AV人片传媒| 色色色.COM| 狠狠CAO日日穞夜夜穞AV| 91丨九色丨东北熟女| 丁香五月婷婷网| 超爽内射| 99热这里只有精品86| 九月停停| 日日夜夜青青草| 丁香婷婷综合激情五月色| 色五月大香蕉| 欧洲亚洲免费视频9| 婷婷色在线播放| 91九色欧美| 色色色五月婷| 久久三级视频| 91操人| 国产亚洲精品久久久久久郑州| 色五月天天在线观看资源站| 五月花婷婷| 老司机午夜福利视频金瓶梅| h在线看免费版在线看| 欧美性二区| 色综合综合色| 中海油常州环保涂料有限公司| www,天天干| 人妻久久做| 久久99网| 天天 日综合| 天天日天天爽| 婷婷色色网| 丁香五月激情五月色综合| 激情五月婷婷色| 毛v一区二区视频| 夜夜久久综合网| 日本在线视频www色| 91丨九色丨国产打屁股| 九九五月天| 五月丁香激情综合| www。五月,com| 五月激情六月婷婷| 久久久久久久久久久97| 91狠狠综合久久久| 狠狠肏综合网| 九月婷婷人人操人人舔人人爱| 色情婷婷五月天| 国产欧美第五十五页| 久久精典| 狠狠操天天操天天操| 久久成人亚洲欧美电影| 91九色视频在线观看| 婷婷成人综合| 午夜精品久久久久久久爽| 女高怪谈在线观看| 大香蕉综合在线| 日本欧美成人片AAAA| 婷婷.com| 在线色色| 丁香五月天AV在线 | 五月天狠狠网站| 亚洲乱码日产精品BD| 人妻久久久久久久| 一本久道综合99| 国产99热| 精品无码99| 情色五月天网站| 夜夜操加勒比| 亚洲成人无码网站| 欧美毛片www| 五月丁香综合中文| 白人荫道BBWBBB大荫道| 激情丁香五月天| 日本妈妈乱| 婷婷五月色花丁香社区| 六月激情综合| 五月婷婷插一插| 中文字幕97超级碰| 色五月婷婷成人| 日本色色色| www.五月天激情| 亚洲欧洲99| 色九九九九| 国产毛片精品一区二区色欲黄A片| 五月婷婷在线观看黄| 日本色婷婷五月天成人电影| www.com.色色| 婷婷开心青青草| 九九九激情综合| 五月久久婷婷| 九九99一区| 99热只有精品综合| 美国不卡视频| 蜜乳久AV| 久热这里只有| 五月婷婷 激情五月| 亚洲五月婷婷在线| 色五月成人| 婷婷丁香黄色| 色99色| 色综合久久中文| 99色日本| 丁香五月婷综合| 777米奇影视第四色| 香蕉久久国产AV一区二区| 激情99| 99热成人在线| 五月丁香婷婷激情澎湃四射| 激情99热| 色天天综合色| 五月天激情小说婷婷| 日韩人妻无码专区| 97干视频在线| 99狠狠色| 久久久香| 色狠狠999综合| 9999三级片| 天天操天天曰天天射| 亚洲九九婷婷| 午夜av网| 亚洲XX网| 色约约视频一区二区三区四区五区 | www.婷婷六月天| 日本va欧美va国产激情| 20253AV| 久久婷婷五月天丁香| 日韩av一区二区在线/日产精品久久久| 日本精品久久久久中文字幕| 婷婷伊人网| 国产偷人爽久久久久久老妇APP| 婷婷伊人五月天| 综合五月婷婷| 99精品在线播放| 免费看欧美成人A片无码| 亚洲乱码日产精品BD| 91狠狠色丁香婷婷综合久久| 日本乱子人伦在线视频| 国产AV一区二区三区日韩| 丰满少妇猛烈A片免费看观看| 亚洲人操亚洲人| 人妻有码乱操| www.99日本| 五月婷婷色影院| 激情丁香婷婷五月天| 天天橾日日橾夜夜橾17| 国产精品A片| 色色色热热热| 无码区婷婷五月花开| 六月综合婷婷开心伊人| av九九| 精品自拍99| 亚洲六月色婷婷| 久99久在线| 久久激情综合| 色国产五月| 思思久热6| 天天做 天天爱| 欧美美美女性色视频| 在线另类视频| 国产av天堂| 日本大人久久| 久久精品视频99| 色爱综合视频| 五月婷婷视频| 色婷婷电影网| 久操香蕉| 激情综合啪啪| 色婷婷色久综| 91九色国产熟女| 国产毛片精品一区二区色欲黄A片| 丁香五月天堂婷婷| 婷婷综合五月天| 五月综合婷婷网| 五月丁香婷婷综合视频| 伊人在线视频| 天天插天天插| 中文字幕人妻熟女在线| 色约约视频一区二区三区四区五区 | 一级黄色影片| 色五月婷婷AV| 伊人久久激情图区五月| 这里只有精品网| 丁香激情五月| 奇米影视在线视频| 婷婷在线五月天观看| 天天色综网| 另类少妇人与禽zOZZ0性伦| 日韩成人综合| 久鲁鲁色网| 中文字幕激情综合| 粉嫩AV久久一区二区三区| 久久3p| 久久99最新| 婷色五月天| 九九久久腿| 琪琪理论片| 亚洲综合视频在线| 欧美成综合在线观看| 欧美激情综合| 丁香五月婷婷av| 久久久天堂国产精品女人| www.粉嫩av.com| 激情AV在线| 99cao婷婷| 777久久综合视频| 久99久在线观看| 婷婷五月精品中文| 五月婷婷自拍视频| 狠狠爱综合网| 色五月激情网| 99热99热在线| 教师性爱毛片| 日日干综合| AV九九| 久久Xx| 亚洲热久久| 亚洲欧美综合7777色亭亭| 梁铮版蜘蛛女在线观看| 久久婷婷色综合| 影音先锋偷偷色男人站| 少妇达人正片在线播放_ikun_福利吧| 疯狂做受XXXX高潮A片动画| 秋霞性爱AV| 五月天丁香| 色婷婷久久视屏| 色五月婷婷在线观看| 日韩专区五月天婷婷丁香| 天天插夜夜爽| 九九亚洲| 午夜美女人啪最红院| 大香蕉久久| 五月婷婷性爱| www.minyis.com【JT】实力收量可预付QQ2101460746| 亚洲一区二区无遮挡A片| 婷婷六月激情在线视频| 碰超亚洲| 激情五月丁香激情综合网 | 99热最新| 丁香婷婷性久久| 五月婷婷激情| 成人资源在线| 无码区婷婷五月花开| 婷婷五月天综合AV| 婷婷成人视频| 探花搜索结果 - 黄上黄| 天天色噜| 98永久精品| 日本久久婷婷| 玖玖综合色| 8区视频在线| www.99热| 亚洲日韩乱码一区二区三区四区| 五月天色狠狠| 秋霞av吧| 思思热久热| 九九热婷婷| 91超级碰碰| 欧美性二区| 熟妇内谢69XXXXXA片| 五月天色裸体视频| 超碰A V在线| 国产成人高清| 熟女激情网| 国产偷人爽久久久久久老妇APP| 激情九九综合网| 碰人人操| 婷婷的99视频网站| 色99视| 九九色婷婷五月天| 婷婷久久丁香| 欧美噜噜噜草| 极品人妻VIDEOSSS人妻| 国产玖玖资源| 超碰人人色| 国产成人片| 日本五月婷| 香蕉综合网| 天天综合色| 色婷婷精品| 五月丁香激情综合| 亚洲视频一区| 日本婷色| 99ri国产在线| 综合色图婷婷| 9久久久久| 激情综合网络插| 潮汕成人AV片在线| 丁香五月天啪啪| 开心五月深爱五月婷| 国内一级精品| 五月婷婷啪啪啪啪| 九九精品亚洲| xxx综合在线| 91免费看片| 日本色婷婷| 丁香五月成人av| 都市激情蜜桃婷婷五月天| www.ywav| 成年人丁香五月| 丁香色婷婷| 丁香婷婷久久| 99超碰在线免费| 无码人妻少妇色欲AV一区二区| 五月丁香婷庭在线| 国产免费一区二区在线A片视频| 国产乱子轮XXX农村| 久久久性爱视频| 日日夜夜小色哥| 99视频久久| 熟女国产在线一区二区三区四区| 激情综合色| 最新va在线播放| 夜夜操狠狠操天天操| 狠狠综合| 噜噜五月天综合| 亚洲亚洲人成综合网络| 97干视频| 激情五月天www| 99亚洲综合| 天天肏视频| AV在线免费观看不卡| 丁香五月综合| 激情五月天电影| 婷婷狠狠色| 婷婷五月久久| 激情婷婷综合| 久久婷婷五月综合伊人| 欧美婷婷丁香五月| 九月丁香久久网| 婷婷久久色| 综激情网| 九九热在线视频| 六月伊人婷婷| 色情五月综合婷婷| 91凹凸在线| 色蜜婷婷| 婷婷五月激情综合网| 98国产精品综合一区二区三区| 天天操天天曰| 操逼巨乳91| 日本狠狠色| 五月丁香综合激情网| 可以直接看的av网站| 婷婷五月天直播| 婷婷丁香五月天色播网站| 97色永久免费视频| 婷婷色吧| 玖玖午夜视频| AV网址大全在| 91传媒无码人妻精| 色九月丁香婷婷蜜桃在线观看| 亚洲亚洲人成综合网络| 五月天社区| 99性爱| www.国产色| 婷婷五月香蕉| 色色色色色色色色五月先| www.五月天色色.com| 丁香五月天啪啪a日本| 色色色色色网站| 亚洲天堂aaa| 可以免费看的av网站| 99热日韩| 橾逼网| 丁香五月婷婷日本| 97碰碰视频| 丁香色五月 97干| 丁香午夜天| 亚洲激情五月天| 五月丁香久久| 狠狠色 综合色区| 色五月丁香com| 在线超碰精品| 九九99香蕉在线视频播放| 69精品人人人人人人| 激情五月天啪啪| 婷婷综合| 精品综合久久久久久五月天| 五月情四婷婷| 五月丁香婷婷三级| 婷婷五月天AV| 日本天堂免费99| 久热99| 色五月情| 国产干逼片| 色色综合激情| 色情五月天小说| 九九热99精品| 天天日,天天射,天天舔| 99久超碰| 婷婷丁香六月天| 中文字幕日产A片在线看| 久久受www免费人成| 色玖玖综合| BT综合在线视频观看| 久久东京热婷婷五月| 26uuu.| 五月丁香六月婷婷无码| 97超碰在线免费观看| 亚洲AV成人在线| 亚洲av另类在线观看| 99视频| 九九色播五月丁香| 琪琪理论片| 开心婷婷五月天激情网| 成人电影AV在线观看| 欧美成人精品A片免费一区99| 五月丁香六月情| 婷婷九月激情| 婷婷激情五月色综合| 91超碰人人操| 久久激情五月| 色色草97| 久久综合丁香五月| 五月丁综合在线观看| 国精产品一区一区三区有限公司杨 | 国产超碰在线| 丁香六月激情综合啪啪| 91啪啪视频| 日韩久久系列| 91婷婷丁香五月| 日韩六六久久电影| 深夜男女福利刺激影院一区完整| 色网五月婷婷| 在线中文亚洲| 婷婷五月天论坛| 天天狠天天叉| 99久久超级| 成人五月天婷婷| 激情五月综合| 91人久| 91色噜噜狠狠狠狠色综合| 男女久久婷婷五月天| 六月婷婷开心| 色综合久久综合| 色婷婷狠狠干| 亚洲婷婷基地| 淫视馆av三区| WWW·天天操·视频?| 五月亭亭直播| 操碰色一区就去操| 看婷婷五月天网| 五月天激情婷婷久久| 亚洲精品无人区| 1024日韩| 97性视频| 婷婷碰碰| 激情图片婷婷| 五月天色不卡| 色婷天天| 99性爱视频网站| 少妇水多A片太爽了| 五月色情婷婷| 99精品久久久久久久婷婷| www.婷婷激情网.com| 五月天激情网址| 欧美日韩99| 色婷婷丁香五月天| www.婷婷五月天| 五月综合激情图片 | www.henhengan| 国产毛片欧美毛片久久久| 怡红院 久久| 91色婷婷综合久久中文字幕二区| 激情小说五月天| 久久这里都是精品免费| 五月丁香婷婷在线| 91无码高清| 日日艹思思热| 九九精品9| 99热这里只有国产精品| 国产黄大片在线观看画质优化 | 中文激情网| 婷婷娌伦网| 色五月大香蕉婷婷| 婷婷色色婷婷| 六月激情丁香一道本7777| 亚洲人人操BD| 五月婷婷色色爱| 久久人妻系列| 九九色网专区| www.五月天婷婷姐姐| 香蕉婷婷五月| 久久性爱视频这里只有精品|