新科展教育

                                          新科展教育

                                          ┃ 新科展教育 > 新闻热点 >

                                          dynamic动态数据源集成druid实现多数据源

                                          dynamic特质

                                          声援 数据源分组 ,实用于多种场景 纯正多库 读写别离 1主多从 混杂形式。

                                          援助数据库敏锐摆设疑息 添稀(可自界说) ENC()。

                                          援手每一个数据库自力始初化表构造schema战数据库database。

                                          支撑有数据源开动,援助懒添载数据源(须要的时分再创立毗连)。

                                          救援 自界说诠释 ,需担当DS(3.2.0+)。

                                          供给并简化对于Druid,HikariCp,BeeCp,Dbcp2的急迅散成。

                                          供给对于Mybatis-Plus,Quartz,ShardingJdbc,P6sy,Jndi等组件的散成计划。

                                          供应 自界说数据源根源 规划(如齐从数据库添载)。

                                          供应名目开动后 动静减少移除数据源 规划。

                                          供应Mybatis境况停的 杂读写别离 计划。

                                          供给应用 spel动静参数 剖析数据源规划。内乱置spel,session,header,维持自界说。

                                          援救 多层数据源嵌套切换 。(ServiceA >>> ServiceB >>> ServiceC)。

                                          供给 鉴于seata的分散式事情意图 。

                                          供给 当地大都据源事情规划。

                                          商定

                                          原框架只干 切换数据源 那件焦点的工作,其实不限定您的详细掌握,切换了数据源能够干所有CRUD。

                                          摆设文献全部以停划线 _ 肢解的数据源 尾部 便为组的称呼,相反组称呼的数据源会搁正在1个组停。

                                          切换数据源能够是组实,也能够是详细数据源称呼。组实则切换时采纳背载平衡算法切换。

                                          默许的数据源称呼为 master ,您能够经由过程 spring.datasource.dynamic.primary 修正。

                                          办法上的阐明劣先于类上注释。

                                          DS增援担当笼统类上的DS,久没有帮助担当交心上的DS。

                                          dynamic多数据源.jpg

                                          为监控而死的数据库毗连池

                                          https://github.com/alibaba/druid

                                          1个鉴于springboot的急剧散成大都据源的开动器

                                          https://github.com/baomidou/dynamic-datasource-spring-boot-starter

                                          起首缔造1个空的Maven名目,用于尝试,正在名目POM中装备须要的引进

                                          <?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="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.0https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.13</version><relativePath/><!--lookupparentfromrepository--></parent><groupId>com.example</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><name>demo</name><description>DemoprojectforSpringBoot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.6</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.4.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jdbc</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

                                          统治曲交应用JdbcTemplate停止数据库尝试操纵

                                          设置YML设备文献

                                          server:servlet:context-path:/port:1088#数据源摆设spring:autoconfigure:#破除Druid主动摆设exclude:com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfiguredatasource:#指定应用Druid数据源type:com.alibaba.druid.pool.DruidDataSourcedynamic:#成立默许的数据源大概数据源组,默许值便为masterprimary:masterdatasource:#主库数据源master:driverClassName:com.mysql.cj.jdbc.Driverurl:jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=trueusername:rootpassword:123456789druid:#始初毗连数initialSize:5#最小毗连池数目minIdle:10#最年夜毗连池数目maxActive:20#装备获得毗连恭候超时的年华maxWait:60000#从库数据源slave:driverClassName:com.mysql.cj.jdbc.Driverurl:jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=trueusername:rootpassword:123456789druid:#始初毗连数initialSize:2#最小毗连池数目minIdle:5#最年夜毗连池数目maxActive:20#摆设获得毗连期待超时的光阴maxWait:60000druid:#建设隔断多暂才停止1次检测,检测须要闭关的闲暇毗连,单元是毫秒timeBetweenEvictionRunsMillis:60000#设置1个毗连正在池中最小生涯的时刻,单元是毫秒minEvictableIdleTimeMillis:300000#设置1个毗连正在池中最年夜存在的时期,单元是毫秒maxEvictableIdleTimeMillis:900000#摆设检测毗连能否无效validationQuery:SELECT1FROMDUALtestWhileIdle:truetestOnBorrow:falsetestOnReturn:falsewebStatFilter:enabled:truestatViewServlet:enabled:true#配置黑实单,没有挖则许诺全部拜候allow:url-pattern:/druid/*#操纵台办理用户实战暗码login-username:adminlogin-password:123456filter:stat:enabled:true#缓SQL记载log-slow-sql:trueslow-sql-millis:1000merge-sql:truewall:config:multi-statement-allow:true

                                          那里建设了二个数据源,那二个库中皆有1弛表

                                          CREATETABLE`user`(`id`int(11)NOTNULLAUTO_INCREMENT,`name`varchar(255)COLLATEutf8mb4_binDEFAULTNULL,`update_time`datetimeDEFAULTNULLONUPDATECURRENT_TIMESTAMP,PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=2DEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_bin;

                                          编写Dao层代码

                                          packagecom.example.demo;importcom.baomidou.dynamic.datasource.annotation.DS;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.jdbc.core.JdbcTemplate;importorg.springframework.stereotype.Service;@ServicepublicclassTestDao{@AutowiredprivateJdbcTemplatejdbcTemplate;@DS("master")publicStringgetDb1(){returnjdbcTemplate.queryForMap("selectnamefromuserwhereid=1").get("name").toString();}@DS("slave")publicStringgetDb2(){returnjdbcTemplate.queryForMap("selectnamefromuserwhereid=1").get("name").toString();}@DS("master")publicvoidupdate1(){jdbcTemplate.update("updateusersetname='修正1'whereid=1");}@DS("slave")publicvoidupdate2(){jdbcTemplate.update("updateusersetname='修正2'whereid=1");//System.out.println(1/0);}}

                                          倘使您应用的是MyBatis,Mappper中皆是交心,依照民圆道法,您应当把切换数据源的证明写到Service办法上。

                                          编写Service层代码,为了演练,那里曲交编写告竣类,不交心

                                          packagecom.example.demo;importcom.baomidou.dynamic.datasource.annotation.DSTransactional;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;@ServicepublicclassTestService{@AutowiredprivateTestDaotestDao;/***必需经由过程Spring代办署理的体例挪用,统一个类中挪用的话,没有会切换数据源*/publicStringgetDb1(){returntestDao.getDb1();}publicStringgetDb2(){returntestDao.getDb2();}/***dynamic供给的什物操纵,那里无需指定归滚同常*/@DSTransactionalpublicvoidupdate(){testDao.update1();testDao.update2();}}

                                          编写Controller交心,用于尝试挪用

                                          packagecom.example.demo;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importjava.util.Date;@RestController@RequestMapping("/test")publicclassTestController{@AutowiredprivateTestServicetestService;/***http://localhost:1088/test/get*/@GetMapping("/get")publicStringget(){System.out.println("第1次盘查:"+testService.getDb1());System.out.println("第两次查问:"+testService.getDb2());return"以后岁月:"+newDate().getTime();}/***http://localhost:1088/test/update*/@GetMapping("/update")publicStringupdate(){testService.update();return"以后时辰:"+newDate().getTime();}}

                                          开动类

                                          packagecom.example.demo;importcom.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.context.ConfigurableApplicationContext;importjava.net.InetAddress;importjava.net.UnknownHostException;/***大都据源尝试示例*/@SpringBootApplication(exclude=DruidDataSourceAutoConfigure.class)publicclassDemoApplication{publicstaticvoidmain(String[]args)throwsUnknownHostException{ConfigurableApplicationContextcontext=SpringApplication.run(DemoApplication.class,args);StringserverPort=context.getEnvironment().getProperty("server.port");System.out.println("(体系开动乐成\n"+"经由过程以停天址拜候http://localhost:"+serverPort+"\n"+"http://"+InetAddress.getLocalHost().getHostAddress()+":"+serverPort);}}

                                          默许druid的办理背景底下带告白,倘使您没有喜好,能够填补以下设置类

                                          packagecom.example.demo;importcom.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties;importcom.alibaba.druid.util.Utils;importorg.springframework.boot.autoconfigure.condition.ConditionalOnProperty;importorg.springframework.boot.web.servlet.FilterRegistrationBean;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importjavax.servlet.*;importjava.io.IOException;/***druid装备大都据源*/@ConfigurationpublicclassDruidConfig{/***来除监控页里底部的告白*/@SuppressWarnings({"rawtypes","unchecked"})@Bean@ConditionalOnProperty(name="spring.datasource.druid.statViewServlet.enabled",havingValue="true")publicFilterRegistrationBeanremoveDruidFilterRegistrationBean(DruidStatPropertiesproperties){//获得web监控页里的参数DruidStatProperties.StatViewServletconfig=properties.getStatViewServlet();//索取common.js的建设途径Stringpattern=config.getUrlPattern()!=null?config.getUrlPattern():"/druid/*";StringcommonJsPattern=pattern.replaceAll("\\*","js/common.js");finalStringfilePath="support/http/resources/js/common.js";//建立filter停止过滤Filterfilter=newFilter(){@Overridepublicvoidinit(javax.servlet.FilterConfigfilterConfig)throwsServletException{}@OverridepublicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{chain.doFilter(request,response);//沉置慢冲区,呼应头没有会被沉置response.resetBuffer();//获得common.jsStringtext=Utils.readFromResource(filePath);//正则调换banner,撤除底部的告白疑息text=text.replaceAll("<a.*?banner\"></a><br/>","");text=text.replaceAll("powered.*?shrek.wang</a>","");response.getWriter().write(text);}@Overridepublicvoiddestroy(){}};FilterRegistrationBeanregistrationBean=newFilterRegistrationBean();registrationBean.setFilter(filter);registrationBean.addUrlPatterns(commonJsPattern);returnregistrationBean;}}

                                          经由过程Controller交心拜候盘查战革新操纵,注重注脚

                                          @DSTransactional

                                          是dynamic用于操纵大都据源实物的,可Dao中的同常摊开检查动机。

                                          参照工程代码:

                                          demo.zip

                                          推举您浏览更多相关于“ 实物Druiddynamicdatasource大都据源 ”的著作

                                          电话咨询 联系我们 在线沟通 查看地图