一个项目中配置多个数据源(链接不同库jdbc),无限大,具体多少根据内存大小

项目中多数据源如何划分:分包名(业务)或注解方式。分包名方式类似多个不同的jar,同业务需求放一个包中。

分包方式配置多数据源

项目目录结构

2.14.1 pom文件

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.9.RELEASE</version>
</parent> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- mybatis-spring-boot-starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
<!-- mysql 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<!-- 提示建议引入 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies>

2.14.2 创建test1包名下类

public class Employee implements Serializable{
private static final long serialVersionUID = 1L;
private Integer id;
private String lastName;
public interface EmployeeDao {

//    @Insert("insert into myemployeee(last_name) values (#{lastName})")
int insert(Employee emp);
}

EmployeeMapping.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.springboot2.test1.dao.EmployeeDao">
<insert id="insert" parameterType="com.springboot2.test1.bean.Employee">
insert into myemployeee(last_name) values (#{lastName,jdbcType=VARCHAR})
</insert>
</mapper>

service类

@Service
public class EmployeeService {
@Autowired
EmployeeDao employeeDao; public Integer insert(Employee emp) {
return employeeDao.insert(emp);
}
}

2.14.3 创建test2包名下类

public class User implements Serializable{

    private static final long serialVersionUID = 1L;
private Integer id;
private String name;
private Integer age;
public interface UserDao {
// @Insert("insert into myuser(name,age) values (#{name},#{age})")
int insert(User user);
}

UserMapping.xml文件

<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.springboot2.test2.dao.UserDao">
<insert id="insert" parameterType="com.springboot2.test2.bean.User">
insert into myuser(name,age) values (#{name,jdbcType=VARCHAR},#{age,jdbcType=INTEGER})
</insert>
</mapper>
@Service
public class UserService { @Autowired
UserDao userDao; public Integer insert(User user2) {
return userDao.insert(user2);
}
}

2.14.4 重点:多数据源配置

2.14.4.1首先application.yml文件

#多数据源配置
spring:
datasource:
test1: #数据源1(自定义)
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/mytest?useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=GMT%2B8&allowMultiQueries=true
username: root
password: (***)
test2: #数据源2(自定义)
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/mytest2?useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=GMT%2B8&allowMultiQueries=true
username: root
password: (***)

注意:虽然为高版本,但多数据源配置时,必须为spring.datasource.test.jdbc-url而不是spring.datasource.test.url

2.14.4.2多数据源配置类

/**
* 数据源配置
* @author admin
*
*/
@Configuration
@MapperScan(basePackages= "com.springboot2.test1.dao",sqlSessionFactoryRef="test1SqlSessionFactory") //注意:com.springboot2.test1.dao是dao类的包名!!
public class DatasourceConfig1 { /**
* 配置test1数据库
* @return
*/
@Bean(name="test1DataSource")
@ConfigurationProperties(prefix="spring.datasource.test1")
@Primary
public DataSource test1DataSource() {
return DataSourceBuilder.create().build();
} /**
* 创建sqlsessinfactory会话工厂
* @param dataSource
* @return
* @throws Exception
*/
@Bean(name="test1SqlSessionFactory")
@Primary
public SqlSessionFactory test1SqlSessionFactory(@Qualifier("test1DataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
//加载mapping文件
sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources("classpath:com/springboot2/test1/mapping/*.xml"));
return sqlSessionFactoryBean.getObject();
} /**
* 事务管理
*/
@Bean(name="test1TransactionManager")
@Primary
public DataSourceTransactionManager test1TransactionManager(@Qualifier("test1DataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
} /**
* 创建SqlSessionTemplate
* @param sqlSessionFactory
* @return
*/
@Bean(name="test1SqlSessionTemplate")
@Primary
public SqlSessionTemplate test1SqlSessionTemplate(@Qualifier("test1SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
return new SqlSessionTemplate(sqlSessionFactory); }
}
/**
* 数据源配置
* @author admin
*
*/
@Configuration
@MapperScan(basePackages= {"com.springboot2.test2.dao"},sqlSessionFactoryRef="test2SqlSessionFactory")
public class DatasourceConfig2 { /**
* 配置test2数据库
* @return
*/
@Bean(name="test2DataSource")
@ConfigurationProperties(prefix="spring.datasource.test2")
public DataSource test2DataSource() {
return DataSourceBuilder.create().build();
} /**
* 创建sqlsessinfactory会话工厂
* @param dataSource
* @return
* @throws Exception
*/
@Bean(name="test2SqlSessionFactory")
public SqlSessionFactory test2SqlSessionFactory(@Qualifier("test2DataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
//加载mapping文件
sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources("classpath:com/springboot2/test2/mapping/*.xml"));
return sqlSessionFactoryBean.getObject();
} /**
* 事务管理
*/
@Bean(name="test2TransactionManager")
public DataSourceTransactionManager test2TransactionManager(@Qualifier("test2DataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
} /**
* 创建SqlSessionTemplate
* @param sqlSessionFactory
* @return
*/
@Bean(name="test2SqlSessionTemplate")
public SqlSessionTemplate test2SqlSessionTemplate(@Qualifier("test2SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
return new SqlSessionTemplate(sqlSessionFactory); }
}

注意:

1)分包方式下@Primary可以不写!

2)mapperscan扫描为dao类对应的包名而不是dao类,否则会导致无法注入,报错缺少component注解。

2.14.5 controller类

@RestController
public class MultiDataSourceController {
@Autowired
EmployeeService employeeService1;
@Autowired
UserService userService; @RequestMapping("/insertEmployee")
public String insert(String lastName){
Employee emp=new Employee();
emp.setLastName(lastName);
int i=employeeService1.insert(emp);
return i+"";
} //接收json格式请求
@RequestMapping("/insertUser")
public String insert(@RequestBody User user){
User user2=new User();
user2.setAge(user.getAge());
user2.setName(user.getName());
int i=userService.insert(user2);
return i+"";
}
//接收普通格式多参数请求
@RequestMapping("/insertUser2")
public String insertUser2(@RequestParam("name") String name,@RequestParam("age") Integer age){
User user2=new User();
user2.setAge(age);
user2.setName(name);
int i=userService.insert(user2);
return i+"";
}

2.14.7 启动类

@SpringBootApplication
//@MapperScan("com.springboot2.dao")//多数据源下在数据源配置中配置DatasourceConfig1和DatasourceConfig2
public class StartApplication { public static void main(String[] args) {
SpringApplication.run(StartApplication.class, args);
} }

2.14.8 测试

1 Get请求:http://localhost:8080/insertEmployee?lastName=test2222

执行成功返回1

2 Post请求(且content-type为application/json类型)

http://localhost:8080/insertUser

请求参数:

{

"name":"test3",

"age":11

}

返回成功1

3 get请求(content-type类型随意)

http://localhost:8080/insertUser2?name=ttdd&age=22

返回成功1

2.15SpringBoot多数据源事务(24)

@Service
public class EmployeeService {
@Autowired
EmployeeDao employeeDao;
/**
* 添加事务管理
* @param emp
* @return
* @throws Exception
*/
@Transactional(transactionManager="test1TransactionManager",rollbackFor=Exception.class)
public Integer insert(Employee emp) throws Exception{
/**
* 抛出异常事务无效:默认检测unchecked异常才回滚,checked异常也回滚需要设置rollbackFor=Exception.class
* https://www.cnblogs.com/syp172654682/p/9811341.html
*/
int i=this.other(emp);
return i;
} @Transactional(transactionManager="test1TransactionManager")
public Integer other(Employee emp) throws Exception{
int i=employeeDao.insert(emp);
try {
i=i/0;
}catch(Exception e) {
Logger.logMsg(Logger.INFO, "异常");
throw new Exception();
}
return i;
}
}

启动类

@SpringBootApplication
@EnableTransactionManagement
//@MapperScan("com.springboot2.dao")//多数据源下在数据源配置中配置DatasourceConfig1和DatasourceConfig2
public class StartApplication { public static void main(String[] args) {
SpringApplication.run(StartApplication.class, args);
} }

问题:

1)抛出Exception异常事务无效,原因及解决方法见上面代码

2)其他事务失效问题见:https://www.cnblogs.com/cslj2013/p/10924755.html

github: https://github.com/cslj2013/springboot2.0_multi_datasources.git

springboot学习入门简易版九---springboot2.0整合多数据源mybatis mysql8+(22)的更多相关文章

  1. springboot学习入门简易版六---springboot2.0整合全局捕获异常及log4j日志(12-13)

    使用Aop实现 1创建异常请求 在原有项目基础上,jspController中创建一个可能发生异常的请求: /** * 全局捕获异常测试 * @param i * @return */ @Reques ...

  2. springboot学习入门简易版五---springboot2.0整合jsp(11)

    springboot对jsp支持不友好,内部tomcat对jsp不支持,需要使用外部tomcat,且必须打包为war包. 1 创建maven项目 注意:必须为war类型,否则找不到页面. 且不要把js ...

  3. springboot学习入门简易版三---springboot2.0启动方式

    2.4使用@componentscan方式启动 2.4.1 @EnableAutoConfiguration 默认只扫描当前类 @EnableAutoConfiguration 默认只扫描当前类,如果 ...

  4. springboot学习入门简易版二---springboot2.0项目创建

    2 springboot项目创建(5) 环境要求:jdk1.8+ 项目结构: 2.1创建maven工程 Group id :com.springbootdemo Artifact id: spring ...

  5. springboot学习入门简易版八---springboot2.0多环境配置、整合mybatis mysql8+(19-20)

    2.11 SpringBoot多环境配置(19)  application.properties中配置 Spring.profiles.active=prd 配置环境: Application-dev ...

  6. springboot学习入门简易版四---springboot2.0静态资源访问及整合freemarker视图层

    2.4.4 SpringBoot静态资源访问(9) Springboot默认提供静态资源目录位置需放在classpath下,目录名需要符合如下规则 /static  /public  /resourc ...

  7. springboot学习入门简易版一---springboot2.0介绍

    1.1为什么用springboot(2) 传统项目,整合ssm或ssh,配置文件,jar冲突,整合麻烦.Tomcat容器加载web.xml配置内容 springboot完全采用注解化(使用注解方式启动 ...

  8. springboot学习入门简易版七---springboot2.0使用@Async异步执行方法(17)

    1启动类开启异步调用注解 @SpringBootApplication @EnableAsync //开启异步调用 public class StartApplication { 不开启则异步调用无效 ...

  9. SpringBoot2.0 整合 QuartJob ,实现定时器实时管理

    一.QuartJob简介 1.一句话描述 Quartz是一个完全由java编写的开源作业调度框架,形式简易,功能强大. 2.核心API (1).Scheduler 代表一个 Quartz 的独立运行容 ...

随机推荐

  1. 解决iis内存占用过大的问题--ZT

    解决iis内存占用过大的问题 在IIS6下,经常出现w3wp的内存占用不能及时释放,从而导致服务器响应速度很慢. 今天研究了一下,可以做以下配置: 1.在IIS中对每个网站进行单独的应用程序池配置.即 ...

  2. PostgreSQL体系架构与内存结构

    PostgreSQL体系架构 PostgreSQL的内存结构

  3. 在Linux下运行引入了外部jar包的java程序

    如图:H.java里引入了commons-io-2.2.jar 代码如下: import org.apache.commons.io.IOUtils; public class H{ public s ...

  4. null undefined NaN

    数据类型 6大基本 Number  String Boolean Undefined Null.  Symbol (ES6)   3大引用类型 object array Function Regexp ...

  5. IDEA 加载maven工程时

    IDEA首次加载maven文件时,会无法编译,需要更新maven版本才行. 此处选择“add as maven project”. 然后点击maven对话框中的同步按钮,若仍无法更新,需要删除原有配置 ...

  6. SDN实验---使用git安装Mininet

    0:补充Ubuntu截屏 截全屏 printscreen 截取当前窗口 alt + printscreen 截取任意矩形 shift + printscreen 截取全屏到剪切板 ctrl + pri ...

  7. python gzip

    通常用gzip压缩过的云端数据需要做解压处理,以下代码主要用python3实现对获取到的云端gzip压缩数据进行还原. # -*- coding: utf-8 -*- ""&quo ...

  8. 文件上传速度查询方法(watch工具)

    由于业务迁移,需要将大量文件拷贝到目标机器上的/mnt目录,在拷贝过程中,想要查看上传的速度,做法如下:[root@mail01 ~]# du -sh /mnt5.6G /mnt[root@mail0 ...

  9. springboot继承JpaRepository报org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualif

    在SpringBoot项目中使用JPA时总是报注入失败,不能创建继承JpaRepository的类的问题,然后尝试给继承JpaRepository的写个实现类,不出现注入失败的情况,但是过一段时间后继 ...

  10. Dubbo快速入门 五

    5. Dubbo注解版 之前在dubbo配置文件显式编写内容提供者和消费者,官方还提供了了一种注解方式,接下来改造项目 1.服务提供方 dubbo配置文件 将之前手动申明注释掉,添加<dubbo ...