SpringMVC+Mybatis框架的maven Spring boot项目,多数据源的实践

来源:互联网 发布:短暂的婚姻 知乎 编辑:程序博客网 时间:2024/06/01 08:46

      目前最流行的也只是这种SpringMVC+Mybatis框架,做一个项目,公司也不可能让项目只涉及到一个数据源。因为后期可能数据量大的情况,可能项目要重新安排,分布式处理数据也是少不了的。所以无论是后期维护,还是前期准备,都应该多方面考虑,我们用一个数据源可能以后不能满足我们的需求,所以,在搭建框架时,为了以后可扩展性做相应的准备。废话不多说,直接讲如题说的,spring boot 项目如何引用多数据源的。

      

com.xsth ----Application Maven项目启动的类

com.xsth.config  ----配置连接不同的数据源 (AssistantDataSourceConfig 这个类是从数据源)
                  (HostDataSourceConfig 这个类是主数据源)。
com.xsth.controller  ---控制层。
com.xsth.dao  --dao层,实现Mapping包中接口。
com.xsth.mapping.assistant ---这个包是生成文件路径的保存的表的数据源,做副表。
com.xsth.mapping.host  ---这个包是产品数据库表,做主表。
com.xsth.model  ----实体类。
com.xsth.service  ----业务层 (接口和实现类)。
com.xsth.util   ---工具类

src/main/resources   ---这个文件夹是存放数据库配置,和主副数据源的xml文件(说明:
Mapping包不需要在写xml文件,在这里写即可。)
pom.xml  ---项目对象模型,jar包的配置,自动下载。

首先Application这个类里是这样的

package com.xsth;import javax.servlet.MultipartConfigElement;import javax.sql.DataSource;import org.apache.ibatis.session.SqlSessionFactory;import org.mybatis.spring.SqlSessionFactoryBean;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.EnableAutoConfiguration;import org.springframework.boot.builder.SpringApplicationBuilder;import org.springframework.boot.context.embedded.MultipartConfigFactory;import org.springframework.boot.context.web.SpringBootServletInitializer;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;@Configuration@EnableAutoConfiguration//@MapperScan(basePackages = "com.xsth.mapping")@ComponentScan(basePackages = "com.xsth")public class Application extends SpringBootServletInitializer {@Beanpublic MultipartConfigElement multipartConfigElement() {MultipartConfigFactory factory = new MultipartConfigFactory();factory.setMaxFileSize("5MB");factory.setMaxRequestSize("5MB");return factory.createMultipartConfig();}public static void main(String[] args) {SpringApplication.run(Application.class, args);}@Overrideprotected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {return builder.sources(Application.class);}@Beanpublic SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();sessionFactory.setDataSource(dataSource);return sessionFactory.getObject();}}
下面是配置的数据源的类:

package com.xsth.config;import javax.sql.DataSource;import org.apache.ibatis.session.SqlSessionFactory;import org.mybatis.spring.SqlSessionFactoryBean;import org.mybatis.spring.annotation.MapperScan;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Primary;import org.springframework.core.io.support.PathMatchingResourcePatternResolver;import org.springframework.jdbc.datasource.DataSourceTransactionManager;import com.alibaba.druid.pool.DruidDataSource;/** * 连接服务器的数据库 主数据库 *  * */@Configuration// 扫描 Mapping 接口并容器管理@MapperScan(basePackages = HostDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "hostSqlSessionFactory")public class HostDataSourceConfig {// 精确到 host 目录,以便跟其他数据源隔离static final String PACKAGE = "com.xsth.mapping.host";static final String MAPPER_LOCATION = "classpath:mapper/host/*.xml";@Value("${host.datasource.url}")private String url;@Value("${host.datasource.username}")private String user;@Value("${host.datasource.password}")private String password;@Value("${host.datasource.driverClassName}")private String driverClass;@Bean(name = "hostDataSource")@Primarypublic DataSource hostDataSource() {DruidDataSource dataSource = new DruidDataSource();dataSource.setDriverClassName(driverClass);dataSource.setUrl(url);dataSource.setUsername(user);dataSource.setPassword(password);return dataSource;}/** * 事务管理 *  * @return */@Bean(name = "hostTransactionManager")/** * @Primary 标志这个 Bean 如果在多个同类 Bean 候选时,该 Bean 优先被考虑。 *          「多数据源配置的时候注意,必须要有一个主数据源. */@Primarypublic DataSourceTransactionManager hostTransactionManager() {return new DataSourceTransactionManager(hostDataSource());}/** * 创建SqlSessionFactory工厂 *  * @param hostDataSource * @return * @throws Exception */@Bean(name = "hostSqlSessionFactory")@Primarypublic SqlSessionFactory hostSqlSessionFactory(@Qualifier("hostDataSource") DataSource hostDataSource)throws Exception {final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();sessionFactory.setDataSource(hostDataSource);sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(HostDataSourceConfig.MAPPER_LOCATION));return sessionFactory.getObject();}}

下面这个连接的数据源是副数据源,一个项目中,必须有一个主数据源,主数据源只有一个。主数据源用@Primary这个注解,其他去掉这个,代码基本都相同。

package com.xsth.config;import javax.sql.DataSource;import org.apache.ibatis.session.SqlSessionFactory;import org.mybatis.spring.SqlSessionFactoryBean;import org.mybatis.spring.annotation.MapperScan;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.io.support.PathMatchingResourcePatternResolver;import org.springframework.jdbc.datasource.DataSourceTransactionManager;import com.alibaba.druid.pool.DruidDataSource;/** * 存储文件的数据库 副数据库 *  * @author liulinsen * */@Configuration// 扫描 Mapping 接口并容器管理@MapperScan(basePackages = AssistantDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "assistantSqlSessionFactory")public class AssistantDataSourceConfig {// 精确到 assistant 目录,以便跟其他数据源隔离static final String PACKAGE = "com.xsth.mapping.assistant";static final String MAPPER_LOCATION = "classpath:mapper/assistant/*.xml";@Value("${assistant.datasource.url}")private String url;@Value("${assistant.datasource.username}")private String user;@Value("${assistant.datasource.password}")private String password;@Value("${assistant.datasource.driverClassName}")private String driverClass;@Bean(name = "assistantDataSource")public DataSource assistantDataSource() {DruidDataSource dataSource = new DruidDataSource();dataSource.setDriverClassName(driverClass);dataSource.setUrl(url);dataSource.setUsername(user);dataSource.setPassword(password);return dataSource;}/** * 事务管理 *  * @return */@Bean(name = "assistantTransactionManager")public DataSourceTransactionManager assistantTransactionManager() {return new DataSourceTransactionManager(assistantDataSource());}@Bean(name = "assistantSqlSessionFactory")public SqlSessionFactory assistantSqlSessionFactory(@Qualifier("assistantDataSource") DataSource assistantDataSource) throws Exception {final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();sessionFactory.setDataSource(assistantDataSource);sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(AssistantDataSourceConfig.MAPPER_LOCATION));return sessionFactory.getObject();}}
application.properties这个这样写:

assistant.datasource.url=jdbc:mysql://192.168.0.112:3306/database1assistant.datasource.username=rootassistant.datasource.password=123456assistant.datasource.driverClassName=com.mysql.jdbc.Driverhost.datasource.url=jdbc:mysql://192.168.0.112:3306/database2host.datasource.username=roothost.datasource.password=123456host.datasource.driverClassName=com.mysql.jdbc.Driver#host.datasource.max-idle=10#host.datasource.max-wait=10000#host.datasource.min-idle=5#host.datasource.initial-size=5#host.datasource.validation-query=SELECT 1#host.datasource.test-on-borrow=false#host.datasource.test-while-idle=true#host.datasource.time-between-eviction-runs-millis=18800#host.datasource.jdbc-interceptors=ConnectionState;SlowQueryReport(threshold=0)
pom.xml如下:

<?xml version="1.0" encoding="UTF-8"?><project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://maven.apache.org/POM/4.0.0"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.xsth</groupId><artifactId>XsthInterfaceProject</artifactId><version>0.0.1-SNAPSHOT</version><packaging>war</packaging><name>XsthInterfaceProject</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><springversion>4.2.7.RELEASE</springversion></properties><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.3.6.RELEASE</version></parent><dependencies><!-- Spring Boot --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring 其他 --><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>${springversion}</version><!--$NO-MVN-MAN-VER$ --></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${springversion}</version><!--$NO-MVN-MAN-VER$ --></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency><dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>2.6</version></dependency><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>1.8.4</version></dependency><dependency><!-- 只能使用较低版本的jsonpath --><groupId>com.jayway.jsonpath</groupId><artifactId>json-path</artifactId><version>0.9.0</version><!--$NO-MVN-MAN-VER$ --></dependency><!-- mybatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.3.0</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.2.3</version></dependency><!-- 分页插件支持MyBatis3.2.0~3.3.0(包含) --><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>4.1.6</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-autoconfigure --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId><version>1.3.3.RELEASE</version><!--$NO-MVN-MAN-VER$ --></dependency><!-- 框架会默认注入 DataSourceTransactionManager 实例 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!-- https://mvnrepository.com/artifact/com.alibaba/druid --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.0.29</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.39</version><!--$NO-MVN-MAN-VER$ --></dependency><dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><version>9.4-1203-jdbc4</version><!--$NO-MVN-MAN-VER$ --></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>4.2.5.RELEASE</version><!--$NO-MVN-MAN-VER$ --></dependency><!-- web项目依赖包 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.2.5.RELEASE</version><!--$NO-MVN-MAN-VER$ --></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-web --><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>4.2.5.RELEASE</version><!--$NO-MVN-MAN-VER$ --></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-aop --><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>4.2.5.RELEASE</version><!--$NO-MVN-MAN-VER$ --></dependency><!-- 记录日志 log4j --><!-- https://mvnrepository.com/artifact/log4j/log4j --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.14</version></dependency><!-- JSON --><dependency><groupId>org.json</groupId><artifactId>json</artifactId><version>20160810</version></dependency></dependencies><build><plugins><!-- 设置局部的jdk 1.7 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.7</source><target>1.7</target></configuration></plugin></plugins></build></project>


其他的业务层,持久层,控制层,都是和正常的一样。唯一要说明的是mapper这层,里面的xml应该写在如下图所示:


因此,要是数据源量只要一到两个左右,用这种方法其实是可以的。若是数据量大了,我推荐你用我下面一篇文章。本篇文章是个人实践和在在网上查找资料总结出来的,希望对各位开发者有所帮助。

代码在码云上已上传:https://git.oschina.net/edenl/xsthinterfaceproject.git

原创粉丝点击