
一、前言JdbcTemplate配置Druid多数据源的核心在于创建JdbcTemplate时候为其分配不同的数据源然后在需要访问不同数据库的时候使用对应的JdbcTemplate即可。这里介绍在Spring Boot中基于Oracle和Mysql配置Druid多数据源。二、引入依赖先根据《Spring Boot项目创建》应用然后引入如下依赖dependencygroupIdcom.alibaba/groupIdartifactIddruid-spring-boot-starter/artifactIdversion1.1.22/version/dependencydependencygroupIdcom.oracle/groupIdartifactIdojdbc6/artifactIdversion6.0/version/dependencydependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdscoperuntime/scope/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-jdbc/artifactId/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependency三、多数据源配置接着在Spring Boot配置文件application.yml中配置多数据源spring:datasource:druid:# 数据库访问配置, 使用druid数据源mysql:type:com.alibaba.druid.pool.DruidDataSourcedriver-class-name:com.mysql.cj.jdbc.Driverurl:jdbc:mysql://127.0.0.1:3306/springboot?useUnicodetruecharacterEncodingutf8serverTimezoneUTCallowMultiQueriestrueuseSSLfalseusername:springpassword:spring#123oracle:type:com.alibaba.druid.pool.DruidDataSourcedriver-class-name:oracle.jdbc.driver.OracleDriverurl:jdbc:oracle:thin:125.72.228.21:1521:qhfwbzdbusername:wno704password:wno704db312# 连接池配置initial-size:5min-idle:5max-active:20# 连接等待超时时间max-wait:30000# 配置检测可以关闭的空闲连接间隔时间time-between-eviction-runs-millis:60000# 配置连接在池中的最小生存时间min-evictable-idle-time-millis:300000validation-query:select 1 from dualtest-while-idle:truetest-on-borrow:falsetest-on-return:false# 打开PSCache并且指定每个连接上PSCache的大小pool-prepared-statements:truemax-open-prepared-statements:20max-pool-prepared-statement-per-connection-size:20# 配置监控统计拦截的filters, 去掉后监控界面sql无法统计, wall用于防火墙filters:stat,wall# Spring监控AOP切入点如x.y.z.service.*,配置多个英文逗号分隔aop-patterns:com.wno704.boot.service.*# WebStatFilter配置web-stat-filter:enabled:true# 添加过滤规则url-pattern:/*# 忽略过滤的格式exclusions:*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*# StatViewServlet配置stat-view-servlet:enabled:true# 访问路径为/druid时跳转到StatViewServleturl-pattern:/druid/*# 是否能够重置数据reset-enable:false# 需要账号密码才能访问控制台login-username:druidlogin-password:druid123# IP白名单# allow: 127.0.0.1# IP黑名单共同存在时deny优先于allow# deny: 192.168.1.218# 配置StatFilterfilter:stat:log-slow-sql:true然后创建一个多数据源配置类根据application.yml分别配置一个Mysql和Oracle的数据源并且将这两个数据源注入到两个不同的JdbcTemplate中ConfigurationpublicclassDataSourceConfig{PrimaryBean(namemysqldatasource)ConfigurationProperties(spring.datasource.druid.mysql)publicDataSourcedataSourceOne(){returnDruidDataSourceBuilder.create().build();}Bean(nameoracledatasource)ConfigurationProperties(spring.datasource.druid.oracle)publicDataSourcedataSourceTwo(){returnDruidDataSourceBuilder.create().build();}Bean(namemysqlJdbcTemplate)publicJdbcTemplateprimaryJdbcTemplate(Qualifier(mysqldatasource)DataSourcedataSource){returnnewJdbcTemplate(dataSource);}Bean(nameoracleJdbcTemplate)publicJdbcTemplatesecondaryJdbcTemplate(Qualifier(oracledatasource)DataSourcedataSource){returnnewJdbcTemplate(dataSource);}}上述代码根据application.yml创建了mysqldatasource和oracledatasource数据源其中mysqldatasource用Primary标注为主数据源接着根据这两个数据源创建了mysqlJdbcTemplate和oracleJdbcTemplate。Primary标志这个Bean如果在多个同类Bean候选时该Bean优先被考虑。多数据源配置的时候必须要有一个主数据源用Primary标志该Bean。数据源创建完毕接下来开始进行测试代码编写。四、编码首先往Mysql和Oracle中创建测试表并插入一些测试数据Mysqldroptableifexistsstudent;createtablestudent(snoint(11)notnullauto_incrementcomment学号,snamevarchar(50)charactersetutf8collateutf8_general_cinotnullcomment姓名,ssexvarchar(2)charactersetutf8collateutf8_general_cinotnullcomment性别,primarykey(sno)usingbtree)engineinnodbauto_increment1charactersetutf8collateutf8_general_ci row_formatdynamic;insertintostudentvalues(1,KangKang,M);insertintostudentvalues(2,Mike,M);insertintostudentvalues(3,Jane,F);Oracle:CREATE TABLE WNO704.STUDENT ( SNO NUMBER NOT NULL, SNAME NVARCHAR2(50), SSEX NVARCHAR2 (2), CONSTRAINT PK_STUDENT_SNO PRIMARY KEY (SNO) ) tablespace WNO704 PCTFREE 10 initrans 1 maxtrans 255 storage ( INITIAL 768K next 8K minextents 1 MAXEXTENTS unlimited t 8K minextents 1 MAXEXTENTS unlimited ); COMMENT ON COLUMN WNO704.STUDENT.SNO IS 学号; COMMENT ON COLUMN WNO704.STUDENT.SNAME IS 姓名; COMMENT ON COLUMN WNO704.STUDENT.SSEX IS 性别; INSERT INTO STUDENT VALUES (1, KangKang, M); INSERT INTO STUDENT VALUES (2, Mike, M); INSERT INTO STUDENT VALUES (3, Jane, F);MysqlStudentDao接口publicinterfaceMysqlStudentDao{ListMapString,ObjectgetAllStudents();}MysqlStudentDao实现RepositorypublicclassMysqlStudentDaoImplimplementsMysqlStudentDao{AutowiredQualifier(mysqlJdbcTemplate)privateJdbcTemplatejdbcTemplate;OverridepublicListMapString,ObjectgetAllStudents(){returnthis.jdbcTemplate.queryForList(select * from student);}}可看到在MysqlStudentDaoImp中注入的是mysqlJdbcTemplate。OracleStudentDao接口publicinterfaceOracleStudentDao{ListMapString,ObjectgetAllStudents();}OracleStudentDao实现RepositorypublicclassOracleStudentDaoImplimplementsOracleStudentDao{AutowiredQualifier(oracleJdbcTemplate)privateJdbcTemplatejdbcTemplate;OverridepublicListMapString,ObjectgetAllStudents(){returnthis.jdbcTemplate.queryForList(select * from student);}}在OracleStudentDaoImp中注入的是oracleJdbcTemplate。随后编写Service层StudentService接口publicinterfaceStudentService{ListMapString,ObjectgetAllStudentsWithMysql();ListMapString,ObjectgetAllStudentsWithOracle();}StudentService实现Service(studentService)publicclassStudentServiceImplimplementsStudentService{AutowiredprivateOracleStudentDaooracleStudentDao;AutowiredprivateMysqlStudentDaomysqlStudentDao;OverridepublicListMapString,ObjectgetAllStudentsWithMysql(){returnthis.mysqlStudentDao.getAllStudents();}OverridepublicListMapString,ObjectgetAllStudentsWithOracle(){returnthis.oracleStudentDao.getAllStudents();}}五、测试最后编写TestControllerRestControllerpublicclassTestController{AutowiredprivateStudentServicestudentService;RequestMapping(value/getAllStudentsWithMysql,methodRequestMethod.GET)publicListMapString,ObjectgetAllStudentsWithMysql(){returnthis.studentService.getAllStudentsWithMysql();}RequestMapping(value/getAllStudentsWithOracle,methodRequestMethod.GET)publicListMapString,ObjectgetAllStudentsWithOracle(){returnthis.studentService.getAllStudentsWithOracle();}}最终项目目录如下图所示启动项目访问http://localhost:8080/getAllStudentsWithMysqlhttp://localhost:8080/getAllStudentsWithOracle