专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

SpringBoot多数据源切换(二)(依旧超级简单)

  背景:主从架构下,数据库的读写分离1。依赖dependenciesdependencygroupIdorg。springframework。bootgroupIdspringbootstarterwebartifactIddependencydependencygroupIdorg。projectlombokgroupIdlombokartifactIdoptionaltrueoptionaldependencydependencygroupIdorg。springframework。bootgroupIdspringbootstartertestartifactIdscopetestscopedependencydependencygroupIdcom。baomidougroupIdmybatisplusbootstarterartifactIdversion3。5。3versiondependencydependencygroupIdorg。springframework。bootgroupIdspringbootstarteraopartifactIddependencydependencygroupIdcom。alibabagroupIddruidspringbootstarterartifactIdversion1。2。16versiondependencydependencygroupIdmysqlgroupIdmysqlconnectorjavaartifactIdversion8。0。29versiondependencydependencies2。配置数据源spring:datasource:druid:type:com。alibaba。druid。pool。DruidDataSourcemaster:url:jdbc:mysql:127。0。0。1:3307user1?useUnicodetruecharacterEncodingutf8useSSLfalseusername:rootpassword:rootdriverclassname:com。mysql。cj。jdbc。Driverslave1:enabled:trueurl:jdbc:mysql:127。0。0。1:3308user1?useUnicodetruecharacterEncodingutf8useSSLfalseusername:rootpassword:rootdriverclassname:com。mysql。cj。jdbc。Driverotmstariff:enabled:falseurl:jdbc:mysql:127。0。0。1:3306user1?useUnicodetruecharacterEncodingutf8useSSLfalseusername:rootpassword:rootdriverclassname:com。mysql。cj。jdbc。Driver3。注册数据源
  1)创建一个数据源枚举类publicenumDataSourceType{主库MASTER,从库SLAVE1,SLAVE2}
  2)我们切换数据库所需要的bean全部交给spring容器中ConfigurationpublicclassDynamicDataSourceConfig{BeanQualifier(masterDataSource)ConfigurationProperties(spring。datasource。druid。master)publicDataSourcemasterDataSource(){returnDruidDataSourceBuilder。create()。build();}Qualifier(slave1DataSource)BeanConfigurationProperties(spring。datasource。druid。slave1)根据配置文件enabled属性,判断该配置是否生效ConditionalOnProperty(prefixspring。datasource。druid。slave1,nameenabled,havingValuetrue)publicDataSourceslave1DataSource(){returnDruidDataSourceBuilder。create()。build();}Qualifier(slave2DataSource)BeanConfigurationProperties(spring。datasource。druid。slave2)ConditionalOnProperty(prefixspring。datasource。druid。slave2,nameenabled,havingValuetrue)publicDataSourceslave2DataSource(){returnDruidDataSourceBuilder。create()。build();}Bean(namedynamicDataSource)PrimarypublicDynamicDataSourcedataSource(DataSourcemasterDataSource){MapObject,ObjecttargetDataSourcesnewHashMap();targetDataSources。put(DataSourceType。MASTER。name(),masterDataSource);setDataSource(targetDataSources,DataSourceType。SLAVE1。name(),slave1DataSource);setDataSource(targetDataSources,DataSourceType。SLAVE2。name(),slave2DataSource);DynamicDataSourcedynamicDataSourcenewDynamicDataSource();dynamicDataSource。setTargetDataSources(targetDataSources);dynamicDataSource。setDefaultTargetDataSource(masterDataSource);returndynamicDataSource;}设置数据源paramtargetDataSources备选数据源集合paramsourceName数据源名称parambeanNamebean名称publicvoidsetDataSource(MapObject,ObjecttargetDataSources,StringsourceName,StringbeanName){try{DataSourcedataSourceSpringUtils。getBean(beanName);targetDataSources。put(sourceName,dataSource);}catch(Exceptione){}}}4。切换数据源publicclassDynamicDataSourceContextHolder{线程安全privatestaticfinalThreadLocalStringCONTEXTHOLDERnewThreadLocal();设置数据源变量paramdataSourceEnum数据源变量publicstaticvoidsetDataSourceType(Stringtype){CONTEXTHOLDER。set(type);}获取数据源变量return数据源变量publicstaticStringgetDataSourceType(){returnCONTEXTHOLDER。get();}清理数据源return数据源变量publicstaticvoidclearDataSourceType(){CONTEXTHOLDER。remove();}}5。设置数据源
  新建DynamicDataSource类继承AbstractRoutingDataSource类,并实现determineCurrentLookupKey方法,该方法是指定当前默认数据源的方法,该类是实现动态切换数据源的关键publicclassDynamicDataSourceextendsAbstractRoutingDataSource{OverrideprotectedObjectdetermineCurrentLookupKey(){returnDynamicDataSourceContextHolder。getDataSourceType();}}6。自定义多数据源切换注解Target({ElementType。METHOD,ElementType。TYPE})Retention(RetentionPolicy。RUNTIME)DocumentedpublicinterfaceDataSource{DataSourceTypevalue()defaultDataSourceType。MASTER;}7。AOP拦截器的实现Slf4jAspectComponentpublicclassDataSourceAspect{Pointcut(annotation(com。example。datasourceprimordialdemo2。datasource。annotation。DataSource))publicvoiddoPointCut(){}Around(doPointCut())publicObjectaround(ProceedingJoinPointpointcut)throwsThrowable{MethodSignaturesignature(MethodSignature)pointcut。getSignature();Methodmethodsignature。getMethod();DataSourcedataSourcemethod。getAnnotation(DataSource。class);if(Objects。nonNull(dataSource)){DynamicDataSourceContextHolder。setDataSourceType(dataSource。value()。name());}try{returnpointcut。proceed();}finally{销毁数据源在执行方法之后DynamicDataSourceContextHolder。clearDataSourceType();}}}8。启动类修改SpringBootApplication(excludeDataSourceAutoConfiguration。class)9。使用
  此处为了测试,直接放在controller使用GetMapping(0)DataSource(DataSourceType。MASTER)publicResponseEntityListUserquery(){returnResponseEntity。ok(this。userService。query());}GetMapping(1)DataSource(DataSourceType。SLAVE1)publicResponseEntityListUserquery2(){returnResponseEntity。ok(this。userService。query());}GetMapping(2)DataSource(DataSourceType。SLAVE2)publicResponseEntityListUserquery3(){returnResponseEntity。ok(this。userService。query());}为了区分数据不一样,数据库未做主从同步
  master的数据
  slave1的数据
  slave2的数据
  5。用postman进行测试
  获取master的数据
  获取slave1的数据
  获取slave2的数据
  完成~~~源码:〔gitee〕(https:gitee。comTZWwdatasourceprimordialdemo2)〔github〕(https:github。com1137854811datasourceprimordialdemo2)
  注:为什么配置了三个数据源,是为了展示我在做的过程中遇到的一个问题
  刚开始我是按照网上查到的方式注册数据源
  这样做,在全部数据源都注入的时候没有问题,当我在配置中心停掉其中一个数据源时就会出现问题
  3)问题(在masterDataSource添加Primary又会出现其他的错误)Parameter1ofmethoddataSourceincom。example。datasourceprimordialdemo2。datasource。config。DynamicDataSourceConfigrequiredasinglebean,but2werefound:masterDataSource:definedbymethodmasterDataSourceinclasspathresource〔comexampledatasourceprimordialdemo2datasourceconfigDynamicDataSourceConfig。class〕slave2DataSource:definedbymethodslave2DataSourceinclasspathresource〔comexampledatasourceprimordialdemo2datasourceconfigDynamicDataSourceConfig。class〕Action:ConsidermarkingoneofthebeansasPrimary,updatingtheconsumertoacceptmultiplebeans,orusingQualifiertoidentifythebeanthatshouldbeconsumed
  4。解决办法(此方式只针对我代码的解决办法,可能会有其他问题导致此报错,请再寻找其他方法)
  大佬们如果有其他方式请在评论区告知,万分感谢
  我是Tz,想把我遇到的问题都分享给你,想看更多精彩内容,请关注我的wx公众号zhuangtian

首钢队新外援尼克约翰逊我在场上能做任何事,不惧怕接班林书豪的压力很多北京球迷对于北京首钢队后卫外援尼克约翰逊并不了解,毕竟他2014年NBA选秀时顺位仅为42位,并且他只代表火箭队打了28场比赛。尼克在NBA停留的时间并不长。他大多数时间都是在追梦我是个有缺陷的人冲突发生时我因为私事精神状态非常糟糕直播吧10月9日讯追梦今日冲突后首次接受采访谈到了当日冲突的情况,他表示,他当时因为处理自己的私事精神状况非常糟糕。我是个有缺陷的人,我比其他任何人都更清楚这一点,我一直也做了非常羊城晚报苛责李梦的人缺常识和善意中国女篮夺得世界杯亚军,在小组赛拿下队内得分王的球员李梦,却在赛后遭到了一小部分人的非议。因为发高烧,李梦缺席了半决赛和决赛,决赛后,当她在社交媒体上发文庆祝夺得银牌时,她的评论区贝克汉姆后继有人!二儿子加盟英超球队,目标当球星,颜值却拉胯提起万人迷贝克汉姆,相信就算是不看球的人,对他应该都有所耳闻。作为世界足坛公认的超级大帅哥,贝克汉姆的一举一动,都会引来无数球迷的关注。虽然已经离开足坛多年,但是小贝却仍旧离不开绿7届世锦赛冠军晋级决赛!奥沙利文称赞傅家俊,胜者将会创造纪录7届世锦赛冠军晋级决赛!奥沙利文称赞傅家俊,胜者将会创造纪录。2022年斯诺克香港大师赛半决赛,中国44岁老将傅家俊鏖战11局,决胜局打出了单杆147分,以总比分65险胜希金斯,率李盈莹发挥不佳因心态调整不够,下一场排除杂念李盈莹(12号)与队友庆祝得分。新华社记者孟鼎博摄据新华社电在8日进行的世界女排锦标赛第二阶段小组赛中,中国队0比3不敌世界第一意大利队,前几场发挥出色的主攻手李盈莹发挥一般,仅拿足球战报哈兰德第20球,曼城40聚焦哈兰德赛季第20球,曼城40南安普顿领跑北京时间10月8日昨晚2200,英超联赛第10轮,曼城坐镇伊蒂哈德球场迎战南安普顿。上半场哈兰德单刀球中柱,坎塞洛建功,福登破门,曼城半武汉三镇险胜津门虎后,球迷建议成立工作组,归化28岁中超锋霸北京时间10月8日,中超第22轮,大连人将在10月9日对阵成都蓉城,据大连人队官方消息,受当前形势影响,中超第22轮,大连人队主场迎战成都蓉城的比赛,球票现已停止发售。可见就目前的格林表示将无限期离开球队,归期未定德拉蒙德格林在今天的采访种首次公开回应与普尔的冲突,德雷蒙德格林说他将无限期地离开球队。我想给我的球队他们的空间,给乔丹他的空间,并花几天时间或其他任何方式来锻炼自己。。原文(Dr22年来第一次!中国男团世乒赛输同一人,上次刘国梁孔令辉败北2022年10月8日,成都世乒赛爆出超大冷门,年仅19岁的日本小将张本智和发挥神勇,在男团半决赛中连赢王楚钦樊振东,一人独得2分,将中国乒乓球队逼入了绝境,虽然最后日本队因为团体劣女排世锦赛最新积分榜8强名额已产生7席,中国女排保留唯一悬念北京时间10月9日凌晨,女排世锦赛结束了复赛倒数第二个比赛日的争夺,目前已经有7支球队锁定了八强名额,分别是F组的塞尔维亚美国土耳其和波兰,E组的意大利巴西日本,而中国女排保留着唯
你的肥一直没减下来不是没有原因的你的肥没有减下来不是没有原因的最近天气暖和了,减肥迫在眉睫减肥随着春节后的过年肥,还有余温身边几乎个个都在喊着,要减肥接着开始节食,运动,代餐都安排上一顿操作猛如虎,结果一看瘦了一学雷锋树新风湘水集团湘江永衡航道项目部开展爱心资助活动活动现场。红网时刻新闻3月9日讯(通讯员周亚旭)为了纪念第60个学雷锋纪念日,3月7日,湘江永衡航道项目部干部职工来到祁阳市特殊学校,开展爱心资助活动。祁阳市特殊教育学校是一所对残中央点名,贪污上亿,涉及权色交易,适用终身监禁这年头贪污上百万的官员到处都是,被发现只是早晚问题。这些贪官在手中有了权力之后不仅贪财还很好色腐化堕落,与不法商人沆瀣一气,违规从事营利活动,收受礼金性质极其恶劣,甚至还有涉事金额四川新闻联播丨川渝共青团发布五年行动计划视频加载中唱好双城记,共建经济圈。今天,川渝共青团建功成渝地区双城经济圈建设行动计划出炉,为未来五年川渝青少年携手共进定下行动路线。今天(10日)上午,川渝共青团联席会议第四次会议ampampquot清退令ampampquot抛弃超60岁农民工?中央一号文件5个方面保证农民权益在阅读此文前,诚邀您点击一下关注,既方便您进行讨论与分享,又给您带来不一样的参与感,感谢您的支持。六十岁本是退休的年龄,人们应该安安心心在家养老。不过退休并不是每个人都能享有的权利她,也太帅了!武警西藏总队女子特战大队二级上士王思婧是一名擒敌教员入伍以来她多次在总队组织的比武中获奖在卧虎藏龙的特战大队要和男兵比拼女兵往往要付出加倍努力仅仅一个跃起侧倒王思婧就练习了上百次点U20国足场场被压着打传球成功率47狂飙到八强球迷韩国队最高兴时隔九年,U20国足又一次晋级U20亚洲杯淘汰赛!如果以结果而言,这支国青队显然已经远远超出了大多数球迷的期望,要知道在出征前,有球迷对这支队伍的定义是进1球平1场拿1分,对于主教船舶流量减少巴拿马运河管理局拟提高通行费当地时间3月9日,巴拿马运河管理局行政负责人里考特巴斯克斯(RicaurteVsquez)对媒体表示,预计2023财年通过巴拿马运河的船舶将显著减少,总通行量预计难以达到5亿吨。上接50万名日本老人到我国养老?山东康养集团这样做,背后是何目的最近一段时间,一个爆火的新闻让网友们沸腾了,说山东有一家养老公司,竟然接纳了50万名日本人,来到我国养老。一时之间,网上群情激奋,大家一致质疑日本曾经侵略过我们国家,给我们造成了不一份企业的投资新计划正威集团打造项目新黔景贵州日报天眼新闻记者陈露一年春作首,万事行为先。2月6日,中国西部高科技材料产业基地项目执行总裁宋阳早早地来到基地查看项目进展,作为正威集团布局贵州的第一个新型工业化样板工程,这一高成长企业瑞泰生物完成近亿元A轮融资,松禾资本领投南方财经全媒体记者刘黎霞广州报道近日,广州瑞泰生物科技有限公司(下文简称瑞泰生物)宣布完成近亿元人民币的A轮融资。本轮融资由松禾资本领投,中大创投知名产业资本跟投,现有股东惠每资本
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网