springboot 多数据源(三种数据库连接池--JDBC,dbcp2,Druid)

本文使用的是springboot2.0(在配置数据源时和springboot1.X略有区别)

首先:springboot默认支持的连接池有dbcp,dbcp2, tomcat, hikari四种连接池

  1. 由于Tomcat数据源连接池的性能和并发,在tomcat可用时,我们总是优先使用它。
  2. 如果HikariCP可用,我们将使用它。
  3. 如果Commons DBCP可用,我们将使用它,但在生产环境不推荐使用它。
  4. 最后,如果Commons DBCP2可用,我们将使用它

  即自动优先级tomcat>HikariCP>DBCP>DBCP2(想要使用后面的连接池需要指定类型type:如:spring.datasource.ccjoin-settlement.type=org.apache.commons.dbcp2.BasicDataSource)

本例使用的是用多数据源,不同连接池:

需要的包:

spring-boot-starter-web(包含自带的tomcat)、mybatis-spring-boot-starter

springboot数据库连接:
有两种方法与数据库建立连接,一种是集成Mybatis,另一种用JdbcTemplate
用JdbcTemplate需要的包:
mysql-connector-java、spring-boot-starter-jdbc
集成mybatis需要的包:
mysql-connector-java、spring-boot-starter-jdbc、mybatis-spring-boot-starter

首先:目录结构如下

springboot 多数据源(三种数据库连接池--JDBC,dbcp2,Druid)_第1张图片

pom.xml如下

  1 
  2   3     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4     4.0.0
  5 
  6     com.jmu.ccjoin
  7     spring-boot
  8     0.0.1-SNAPSHOT
  9     war
 10 
 11     spring-boot
 12     spring-boot
 13 
 14     
 15         org.springframework.boot
 16         spring-boot-starter-parent
 17         2.0.4.RELEASE
 18          
 19     
 20 
 21     
 22         UTF-8
 23         UTF-8
 24         1.8
 25     
 26 
 27     
 28         
 29             org.springframework.boot
 30             spring-boot-starter-web
 31         
 32 
 33         
 34         
 35             org.springframework.boot
 36             spring-boot-starter-tomcat
 37             
 38         
 39 
 40         
 41             org.mybatis.spring.boot
 42             mybatis-spring-boot-starter
 43             1.3.2
 44         
 45 
 46         
 47             mysql
 48             mysql-connector-java
 49             runtime
 50         
 51 
 52         
 53             org.springframework.boot
 54             spring-boot-starter-jdbc
 55         
 56         
 57         
 58         
 59             org.apache.commons
 60             commons-dbcp2
 61         
 62 
 63         
 64         
 65             commons-dbcp
 66             commons-dbcp
 67             1.4
 68         
 69 
 70         
 71         
 72             com.alibaba
 73             druid
 74             1.1.10
 75         
 76 
 77         
 78             org.springframework.boot
 79             spring-boot-starter-test
 80             test
 81         
 82         
 83             org.springframework.boot
 84             spring-boot-configuration-processor
 85             false
 86         
 87     
 88 
 89     
 90         spring-boot
 91         
 92             
 93                 org.springframework.boot
 94                 spring-boot-maven-plugin
 95                 
 96                     
 97                         
 98                             repackage
 99                         
100                     
101                 
102             
103         
104     
105 
106 

ConfigProperties.java(把配置文件封装到bean并注入spring容器)

  1 package com.jmu.ccjoin.config;
  2 
  3 import org.springframework.beans.factory.annotation.Value;
  4 import org.springframework.context.annotation.PropertySource;
  5 import org.springframework.stereotype.Component;
  6 
  7 @Component
  8 @PropertySource("file:/var/opt/spring-boot-test/config.properties")
  9 public class ConfigProperties {
 10 
 11     @Value("${spring.datasource.jmuv3.jdbc-url}")
 12     private String jmuv3Url;
 13 
 14     @Value("${spring.datasource.jmuv3.driver-class-name}")
 15     private String jmuv3DriverClassName;
 16 
 17     @Value("${spring.datasource.jmuv3.username}")
 18     private String jmuv3Username;
 19 
 20     @Value("${spring.datasource.jmuv3.password}")
 21     private String jmuv3Password;
 22 
 23     @Value("${spring.datasource.ccjoin-settlement.jdbc-url}")
 24     private String ccjoinSettlementUrl;
 25 
 26     @Value("${spring.datasource.ccjoin-settlement.driver-class-name}")
 27     private String ccjoinSettlementDriverClassName;
 28 
 29     @Value("${spring.datasource.ccjoin-settlement.username}")
 30     private String ccjoinSettlementUsername;
 31 
 32     @Value("${spring.datasource.ccjoin-settlement.password}")
 33     private String ccjoinSettlementPassword;
 34 
 35     @Value("${spring.datasource.ccjoin-settlement.type}")
 36     private String ccjoinSettlementType;
 37 
 38     @Value("${spring.datasource.jmu-mp.jdbc-url}")
 39     private String jmuMpUrl;
 40 
 41     @Value("${spring.datasource.jmu-mp.driver-class-name}")
 42     private String jmuMpDriverClassName;
 43 
 44     @Value("${spring.datasource.jmu-mp.username}")
 45     private String jmuMpUsername;
 46 
 47     @Value("${spring.datasource.jmu-mp.password}")
 48     private String jmuMpPassword;
 49 
 50     /**
 51      * jmuv3Url的取得
 52      * 
 53      * @return String jmuv3Url
 54      */
 55     public String getJmuv3Url() {
 56         return jmuv3Url;
 57     }
 58 
 59     /**
 60      * jmuv3Url的设定
 61      * 
 62      * @param jmuv3Url
 63      *            jmuv3Url
 64      */
 65     public void setJmuv3Url(String jmuv3Url) {
 66         this.jmuv3Url = jmuv3Url;
 67     }
 68 
 69     /**
 70      * jmuv3DriverClassName的取得
 71      * 
 72      * @return String jmuv3DriverClassName
 73      */
 74     public String getJmuv3DriverClassName() {
 75         return jmuv3DriverClassName;
 76     }
 77 
 78     /**
 79      * jmuv3DriverClassName的设定
 80      * 
 81      * @param jmuv3DriverClassName
 82      *            jmuv3DriverClassName
 83      */
 84     public void setJmuv3DriverClassName(String jmuv3DriverClassName) {
 85         this.jmuv3DriverClassName = jmuv3DriverClassName;
 86     }
 87 
 88     /**
 89      * jmuv3Username的取得
 90      * 
 91      * @return String jmuv3Username
 92      */
 93     public String getJmuv3Username() {
 94         return jmuv3Username;
 95     }
 96 
 97     /**
 98      * jmuv3Username的设定
 99      * 
100      * @param jmuv3Username
101      *            jmuv3Username
102      */
103     public void setJmuv3Username(String jmuv3Username) {
104         this.jmuv3Username = jmuv3Username;
105     }
106 
107     /**
108      * jmuv3Password的取得
109      * 
110      * @return String jmuv3Password
111      */
112     public String getJmuv3Password() {
113         return jmuv3Password;
114     }
115 
116     /**
117      * jmuv3Password的设定
118      * 
119      * @param jmuv3Password
120      *            jmuv3Password
121      */
122     public void setJmuv3Password(String jmuv3Password) {
123         this.jmuv3Password = jmuv3Password;
124     }
125 
126     /**
127      * ccjoinSettlementUrl的取得
128      * 
129      * @return String ccjoinSettlementUrl
130      */
131     public String getCcjoinSettlementUrl() {
132         return ccjoinSettlementUrl;
133     }
134 
135     /**
136      * ccjoinSettlementUrl的设定
137      * 
138      * @param ccjoinSettlementUrl
139      *            ccjoinSettlementUrl
140      */
141     public void setCcjoinSettlementUrl(String ccjoinSettlementUrl) {
142         this.ccjoinSettlementUrl = ccjoinSettlementUrl;
143     }
144 
145     /**
146      * ccjoinSettlementDriverClassName的取得
147      * 
148      * @return String ccjoinSettlementDriverClassName
149      */
150     public String getCcjoinSettlementDriverClassName() {
151         return ccjoinSettlementDriverClassName;
152     }
153 
154     /**
155      * ccjoinSettlementDriverClassName的设定
156      * 
157      * @param ccjoinSettlementDriverClassName
158      *            ccjoinSettlementDriverClassName
159      */
160     public void setCcjoinSettlementDriverClassName(String ccjoinSettlementDriverClassName) {
161         this.ccjoinSettlementDriverClassName = ccjoinSettlementDriverClassName;
162     }
163 
164     /**
165      * ccjoinSettlementUsername的取得
166      * 
167      * @return String ccjoinSettlementUsername
168      */
169     public String getCcjoinSettlementUsername() {
170         return ccjoinSettlementUsername;
171     }
172 
173     /**
174      * ccjoinSettlementUsername的设定
175      * 
176      * @param ccjoinSettlementUsername
177      *            ccjoinSettlementUsername
178      */
179     public void setCcjoinSettlementUsername(String ccjoinSettlementUsername) {
180         this.ccjoinSettlementUsername = ccjoinSettlementUsername;
181     }
182 
183     /**
184      * ccjoinSettlementPassword的取得
185      * 
186      * @return String ccjoinSettlementPassword
187      */
188     public String getCcjoinSettlementPassword() {
189         return ccjoinSettlementPassword;
190     }
191 
192     /**
193      * ccjoinSettlementPassword的设定
194      * 
195      * @param ccjoinSettlementPassword
196      *            ccjoinSettlementPassword
197      */
198     public void setCcjoinSettlementPassword(String ccjoinSettlementPassword) {
199         this.ccjoinSettlementPassword = ccjoinSettlementPassword;
200     }
201 
202     /**
203      * ccjoinSettlementType的取得
204      * 
205      * @return String ccjoinSettlementType
206      */
207     public String getCcjoinSettlementType() {
208         return ccjoinSettlementType;
209     }
210 
211     /**
212      * ccjoinSettlementType的设定
213      * 
214      * @param ccjoinSettlementType
215      *            ccjoinSettlementType
216      */
217     public void setCcjoinSettlementType(String ccjoinSettlementType) {
218         this.ccjoinSettlementType = ccjoinSettlementType;
219     }
220 
221     /**
222      * jmuMpUrl的取得
223      * 
224      * @return String jmuMpUrl
225      */
226     public String getJmuMpUrl() {
227         return jmuMpUrl;
228     }
229 
230     /**
231      * jmuMpUrl的设定
232      * 
233      * @param jmuMpUrl
234      *            jmuMpUrl
235      */
236     public void setJmuMpUrl(String jmuMpUrl) {
237         this.jmuMpUrl = jmuMpUrl;
238     }
239 
240     /**
241      * jmuMpDriverClassName的取得
242      * 
243      * @return String jmuMpDriverClassName
244      */
245     public String getJmuMpDriverClassName() {
246         return jmuMpDriverClassName;
247     }
248 
249     /**
250      * jmuMpDriverClassName的设定
251      * 
252      * @param jmuMpDriverClassName
253      *            jmuMpDriverClassName
254      */
255     public void setJmuMpDriverClassName(String jmuMpDriverClassName) {
256         this.jmuMpDriverClassName = jmuMpDriverClassName;
257     }
258 
259     /**
260      * jmuMpUsername的取得
261      * 
262      * @return String jmuMpUsername
263      */
264     public String getJmuMpUsername() {
265         return jmuMpUsername;
266     }
267 
268     /**
269      * jmuMpUsername的设定
270      * 
271      * @param jmuMpUsername
272      *            jmuMpUsername
273      */
274     public void setJmuMpUsername(String jmuMpUsername) {
275         this.jmuMpUsername = jmuMpUsername;
276     }
277 
278     /**
279      * jmuMpPassword的取得
280      * 
281      * @return String jmuMpPassword
282      */
283     public String getJmuMpPassword() {
284         return jmuMpPassword;
285     }
286 
287     /**
288      * jmuMpPassword的设定
289      * 
290      * @param jmuMpPassword
291      *            jmuMpPassword
292      */
293     public void setJmuMpPassword(String jmuMpPassword) {
294         this.jmuMpPassword = jmuMpPassword;
295     }
296 
297 }

DataSourceConfigCcjoinSettlement.java(使用DBCP2连接池,优先级较低,有tomcat自带JDBC连接池时需要指定数据源类型type)

注意 @ConfigurationProperties注解不支持驼峰式

 1 package com.jmu.ccjoin.config;
 2 
 3 import javax.sql.DataSource;
 4 
 5 import org.apache.ibatis.session.SqlSessionFactory;
 6 import org.mybatis.spring.SqlSessionFactoryBean;
 7 import org.mybatis.spring.annotation.MapperScan;
 8 import org.springframework.beans.factory.annotation.Autowired;
 9 import org.springframework.beans.factory.annotation.Qualifier;
10 import org.springframework.boot.context.properties.ConfigurationProperties;
11 import org.springframework.boot.jdbc.DataSourceBuilder;
12 import org.springframework.context.annotation.Bean;
13 import org.springframework.context.annotation.Configuration;
14 import org.springframework.context.annotation.Primary;
15 import org.springframework.core.env.Environment;
16 import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
17 import org.springframework.jdbc.datasource.DataSourceTransactionManager;
18 
19 @Configuration
20 @MapperScan(basePackages = "com.jmu.ccjoin.dao.ccjoinSettlement", sqlSessionFactoryRef = "sqlSessionFactoryCcjoinSettlement")
21 public class DataSourceConfigCcjoinSettlement {
22 
23     @Autowired
24     private Environment env;
25 
26     @Bean(name = "ccjoinSettlement")
27     @ConfigurationProperties(prefix = "spring.datasource.ccjoin-settlement")
28     public DataSource dataSourceCcjoinSettlement() {
29         // 使用DBCP2数据源(在配置文件配置所使用的数据源类型)
30         return DataSourceBuilder.create().build();
31     }
32 
33     @Bean(name = "sqlSessionFactoryCcjoinSettlement")
34     public SqlSessionFactory createSqlSessionFactory(@Qualifier("ccjoinSettlement") DataSource ds) throws Exception {
35 
36         SqlSessionFactoryBean fb = new SqlSessionFactoryBean();
37         fb.setDataSource(ds);
38 
39         fb.setTypeAliasesPackage(env.getProperty("spring.mybatis.typeAliasPackage"));
40         fb.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(env.getProperty("spring.mybatis.mapper.ccjoinSettlement")));
41 
42         return fb.getObject();
43     }
44 
45     @Bean(name = "transactionManagerCcjoinSettlement")
46     @Primary
47     public DataSourceTransactionManager transactionManager(@Qualifier("ccjoinSettlement") DataSource ds) throws Exception {
48         return new DataSourceTransactionManager(ds);
49     }
50 }

DataSourceConfigJmuMp.java(使用第三方数据源阿里连接池Druid)

 1 package com.jmu.ccjoin.config;
 2 
 3 import javax.sql.DataSource;
 4 
 5 import org.apache.ibatis.session.SqlSessionFactory;
 6 import org.mybatis.spring.SqlSessionFactoryBean;
 7 import org.mybatis.spring.annotation.MapperScan;
 8 import org.springframework.beans.factory.annotation.Autowired;
 9 import org.springframework.beans.factory.annotation.Qualifier;
10 import org.springframework.boot.context.properties.ConfigurationProperties;
11 import org.springframework.context.annotation.Bean;
12 import org.springframework.context.annotation.Configuration;
13 import org.springframework.context.annotation.Primary;
14 import org.springframework.core.env.Environment;
15 import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
16 import org.springframework.jdbc.datasource.DataSourceTransactionManager;
17 
18 import com.alibaba.druid.pool.DruidDataSource;
19 
20 @Configuration
21 @MapperScan(basePackages = "com.jmu.ccjoin.dao.jmuMp",sqlSessionFactoryRef="sqlSessionFactoryJmuMp" )
22 public class DataSourceConfigJmuMp {
23 
24     @Autowired
25     private ConfigProperties configProperties;
26 
27     @Autowired
28     private Environment env;
29 
30     @Bean(name = "jmuMp")
31     @ConfigurationProperties(prefix = "spring.datasource.jmu-mp")
32     public DataSource dataSourceJmuMp() {
33 
34         // 使用Druid连接池
35         DruidDataSource ds = new DruidDataSource();
36         ds.setUrl(configProperties.getJmuMpUrl());
37         ds.setUsername(configProperties.getJmuMpUsername());
38         ds.setPassword(configProperties.getJmuMpPassword());
39 
40         return ds;
41     }
42 
43     @Bean(name = "sqlSessionFactoryJmuMp")
44     public SqlSessionFactory createSqlSessionFactory(@Qualifier("jmuMp") DataSource ds) throws Exception {
45 
46         SqlSessionFactoryBean fb = new SqlSessionFactoryBean();
47         fb.setDataSource(ds);
48 
49         fb.setTypeAliasesPackage(env.getProperty("spring.mybatis.typeAliasPackage"));
50         fb.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(env.getProperty("spring.mybatis.mapper.jmuMp")));
51 
52         return fb.getObject();
53     }
54 
55     @Bean(name = "transactionManagerJmuMp")
56     @Primary
57     public DataSourceTransactionManager transactionManager(@Qualifier("jmuMp") DataSource ds) throws Exception {
58         return new DataSourceTransactionManager(ds);
59     }
60 }

DataSourceConfigJmuv3.java(使用Tomcat自带的的jdbc连接池)

 1 package com.jmu.ccjoin.config;
 2 
 3 import javax.sql.DataSource;
 4 
 5 import org.apache.ibatis.session.SqlSessionFactory;
 6 import org.mybatis.spring.SqlSessionFactoryBean;
 7 import org.mybatis.spring.annotation.MapperScan;
 8 import org.springframework.beans.factory.annotation.Autowired;
 9 import org.springframework.beans.factory.annotation.Qualifier;
10 import org.springframework.boot.context.properties.ConfigurationProperties;
11 import org.springframework.boot.jdbc.DataSourceBuilder;
12 import org.springframework.context.annotation.Bean;
13 import org.springframework.context.annotation.Configuration;
14 import org.springframework.context.annotation.Primary;
15 import org.springframework.core.env.Environment;
16 import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
17 import org.springframework.jdbc.datasource.DataSourceTransactionManager;
18 
19 @Configuration
20 @MapperScan(basePackages = "com.jmu.ccjoin.dao.jmuv3", sqlSessionFactoryRef = "sqlSessionFactoryJmuv3")
21 public class DataSourceConfigJmuv3 {
22 
23     @Autowired
24     private Environment env;
25 
26     @Bean(name = "jmuv3")
27     @Primary
28     @ConfigurationProperties(prefix = "spring.datasource.jmuv3")
29     public DataSource dataSourceJmuv3() {
30         // 使用JDBC数据源
31         return DataSourceBuilder.create().build();
32     }
33 
34     @Bean(name = "sqlSessionFactoryJmuv3")
35     @Primary
36     public SqlSessionFactory createSqlSessionFactory(@Qualifier("jmuv3") DataSource ds) throws Exception {
37 
38         SqlSessionFactoryBean fb = new SqlSessionFactoryBean();
39         fb.setDataSource(ds);
40 
41         fb.setTypeAliasesPackage(env.getProperty("spring.mybatis.typeAliasPackage"));
42         fb.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(env.getProperty("spring.mybatis.mapper.jmuv3")));
43 
44         return fb.getObject();
45     }
46 
47     @Bean(name = "transactionManagerJmuv3")
48     @Primary
49     public DataSourceTransactionManager transactionManager(@Qualifier("jmuv3") DataSource ds) throws Exception {
50         return new DataSourceTransactionManager(ds);
51     }
52 }

Application.java

 1 package com.jmu.ccjoin;
 2 
 3 import org.springframework.boot.SpringApplication;
 4 import org.springframework.boot.autoconfigure.SpringBootApplication;
 5 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
 6 import org.springframework.boot.builder.SpringApplicationBuilder;
 7 import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
 8 
 9 @SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
10 public class Application extends SpringBootServletInitializer {
11 
12     public static void main(String[] args) {
13         SpringApplication.run(Application.class, args);
14     }
15 
16     @Override
17     protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
18         return builder.sources(Application.class);
19     }
20 }

application.yml配置文件

 1 server:
 2   port: 20001
 3   servlet:
 4     path: /spring-boot
 5   
 6 spring: 
 7   mybatis: 
 8     typeAliasPackage: com.jmu.ccjoin.entity 
 9     mapper:      
10       jmuv3: classpath:mybatis/mysql/jmuv3/*.xml
11       ccjoinSettlement: classpath:mybatis/mysql/ccjoinSettlement/*.xml    
12       jmuMp: classpath:mybatis/mysql/jmuMp/*.xml
13       
14     

外部配置文件(路径:D:\var\opt\spring-boot-test\config.properties)

 1 # 数据源1配置 
 2 spring.datasource.jmuv3.jdbc-url=jdbc:mysql://172.16.1.23:3306/jmuv3?useUnicode=true&characterEncoding=utf8
 3 spring.datasource.jmuv3.driver-class-name=com.mysql.jdbc.Driver
 4 spring.datasource.jmuv3.username=root
 5 spring.datasource.jmuv3.password=123.com
 6 #数据源1的连接池(使用默认即tomcat自带的JDBC连接池)
 7 
 8 # 数据源2配置 
 9 spring.datasource.ccjoin-settlement.jdbc-url=jdbc:mysql://172.16.1.23:3306/ccjoin_settlement?useUnicode=true&characterEncoding=utf8
10 spring.datasource.ccjoin-settlement.driver-class-name=com.mysql.jdbc.Driver
11 spring.datasource.ccjoin-settlement.username=root
12 spring.datasource.ccjoin-settlement.password=123.com
13 #数据源2的连接池配置(使用DBCP2连接池,也是springboot支持的连接池之一)
14 spring.datasource.ccjoin-settlement.type=org.apache.commons.dbcp2.BasicDataSource
15 
16 # 数据源3配置 
17 spring.datasource.jmu-mp.jdbc-url=jdbc:mysql://172.16.1.23:3306/jmu_mp?useUnicode=true&characterEncoding=utf8
18 spring.datasource.jmu-mp.driver-class-name=com.mysql.jdbc.Driver
19 spring.datasource.jmu-mp.username=root
20 spring.datasource.jmu-mp.password=123.com
21 #数据源3的连接池配置(使用第三方数据源,Druid)
22 
23 
24 #连接池配置
25 spring.datasource.max-wait-millis=10000 
26 spring.datasource.min-idle=5 
27 spring.datasource.initial-size=5 
28 spring.datasource.validation-query=SELECT x 
29 spring.datasource.connection-properties=characterEncoding=utf8

注意配置文件中配置项后面的空格

 

转载于:https://www.cnblogs.com/wzk-0000/p/9544432.html

你可能感兴趣的:(springboot 多数据源(三种数据库连接池--JDBC,dbcp2,Druid))