学习Spring Boot:(二十四)多数据源配置与使用

前言

随着业务量增大,可能有些业务不是放在同一个数据库中,所以系统有需求使用多个数据库完成业务需求,我们需要配置多个数据源,从而进行操作不同数据库中数据。

正文

JdbcTemplate 多数据源

配置

需要在 Spring Boot 中配置多个数据库连接,当然怎么设置连接参数的 key 可以自己决定,

需要注意的是 Spring Boot 2.0 的默认连接池配置参数好像有点问题,由于默认连接池已从 Tomcat 更改为 HikariCP,以前有一个参数 url,已经改成 hikari.jdbcUrl ,不然无法注册。我下面使用的版本是 1.5.9

server:port: 8022
spring:datasource:url: jdbc:mysql://localhost:3306/learn?useSSL=false&allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8username: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driversecond-datasource:url: jdbc:mysql://localhost:3306/learn1?useSSL=false&allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8username: rootpassword: 123457driver-class-name: com.mysql.jdbc.Driver
注册 DataSource

注册两个数据源,分别注册两个 JdbcTemplate

@Configuration
public class DataSourceConfig {/*** 注册 data source** @return*/@ConfigurationProperties(prefix = "spring.datasource")@Bean("firstDataSource")@Primary // 有相同实例优先选择public DataSource firstDataSource() {return DataSourceBuilder.create().build();}@ConfigurationProperties(prefix = "spring.second-datasource")@Bean("secondDataSource")public DataSource secondDataSource() {return DataSourceBuilder.create().build();}@Bean("firstJdbcTemplate")@Primarypublic JdbcTemplate firstJdbcTemplate(DataSource dataSource) {return new JdbcTemplate(dataSource);}@Bean("secondJdbcTemplate")public JdbcTemplate secondJdbcTemplate(@Qualifier("secondDataSource") DataSource dataSource) {return new JdbcTemplate(dataSource);}
}
测试
@SpringBootTest
@RunWith(SpringRunner.class)
public class TestJDBC {@Autowiredprivate JdbcTemplate jdbcTemplate;@Autowired@Qualifier("secondJdbcTemplate")private JdbcTemplate jdbcTemplate1;@Beforepublic void before() {jdbcTemplate.update("DELETE FROM employee");jdbcTemplate1.update("DELETE FROM employee");}@Testpublic void testJDBC() {jdbcTemplate.update("insert into employee(id,name,age) VALUES (1, 'wuwii', 24)");jdbcTemplate1.update("insert into employee(id,name,age) VALUES (1, 'kronchan', 23)");Assert.assertThat("wuwii", Matchers.equalTo(jdbcTemplate.queryForObject("SELECT name FROM employee WHERE id=1", String.class)));Assert.assertThat("kronchan", Matchers.equalTo(jdbcTemplate1.queryForObject("SELECT name FROM employee WHERE id=1", String.class)));}
}

使用 JPA 支持多数据源

配置

相比使用 jdbcTemplate,需要设置下 JPA 的相关参数即可,没多大变化:

server:port: 8022
spring:datasource:url: jdbc:mysql://localhost:3306/learn?useSSL=false&allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8username: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driversecond-datasource:url: jdbc:mysql://localhost:3306/learn1?useSSL=false&allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8username: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driverjpa:show-sql: truedatabase: mysqlhibernate:# update 更新表结构# create 每次启动删除上次表,再创建表,会造成数据丢失# create-drop: 每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。# validate :每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。ddl-auto: updateproperties:hibernate:dialect: org.hibernate.dialect.MySQLDialect

首先一样的是我们要注册相应的 DataSource,还需要指定相应的数据源所对应的实体类和数据操作层 Repository的位置:
* firstDataSource

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "firstEntityManagerFactory",transactionManagerRef = "firstTransactionManager",basePackages = "com.wuwii.module.system.dao" // 设置该数据源对应 dao 层所在的位置
)
public class FirstDataSourceConfig {@Autowiredprivate JpaProperties jpaProperties;@Primary@Bean(name = "firstEntityManager")public EntityManager entityManager(EntityManagerFactoryBuilder builder) {return entityManagerFactoryPrimary(builder).getObject().createEntityManager();}@ConfigurationProperties(prefix = "spring.datasource")@Bean("firstDataSource")@Primary // 有相同实例优先选择,相同实例只能设置唯一public DataSource firstDataSource() {return DataSourceBuilder.create().build();}@Primary@Bean(name = "firstEntityManagerFactory")public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary (EntityManagerFactoryBuilder builder) {return builder.dataSource(firstDataSource()).properties(getVendorProperties(firstDataSource())).packages("com.wuwii.module.system.entity") //设置该数据源对应的实体类所在位置.persistenceUnit("firstPersistenceUnit").build();}private Map<String, String> getVendorProperties(DataSource dataSource) {return jpaProperties.getHibernateProperties(dataSource);}@Primary@Bean(name = "firstTransactionManager")public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());}}
  • secondDataSource
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "secondEntityManagerFactory",transactionManagerRef = "secondTransactionManager",basePackages = "com.wuwii.module.user.dao" // 设置该数据源 dao 层所在的位置
)
public class SecondDataSourceConfig {@Autowiredprivate JpaProperties jpaProperties;@Bean(name = "secondEntityManager")public EntityManager entityManager(EntityManagerFactoryBuilder builder) {return entityManagerFactoryPrimary(builder).getObject().createEntityManager();}@ConfigurationProperties(prefix = "spring.second-datasource")@Bean("secondDataSource")public DataSource secondDataSource() {return DataSourceBuilder.create().build();}@Bean(name = "secondEntityManagerFactory")public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary (EntityManagerFactoryBuilder builder) {return builder.dataSource(secondDataSource()).properties(getVendorProperties(secondDataSource())).packages("com.wuwii.module.user.entity") //设置该数据源锁对应的实体类所在的位置.persistenceUnit("secondPersistenceUnit").build();}private Map<String, String> getVendorProperties(DataSource dataSource) {return jpaProperties.getHibernateProperties(dataSource);}@Bean(name = "secondTransactionManager")public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());}}
测试
@SpringBootTest
@RunWith(SpringRunner.class)
public class TestDemo {@Autowiredprivate EmployeeDao employeeDao;@Autowiredprivate UserDao userDao;@Beforepublic void before() {employeeDao.deleteAll();userDao.deleteAll();}@Testpublic void test() {Employee employee = new Employee(null, "wuwii", 24);employeeDao.save(employee);User user = new User(null, "KronChan", 24);userDao.save(user);Assert.assertThat(employee, Matchers.equalTo(employeeDao.findOne(Example.of(employee))));Assert.assertThat(user, Matchers.equalTo(userDao.findOne(Example.of(user))));}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/556807.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab 超限像素平滑法,matlab超限像素平滑法_图像增强技术.ppt

主讲&#xff1a;苏菡 susuhansicnu.edu.cn 图象增强技术概述 目标&#xff1a;“视觉”效果更好&#xff0c;图象保真度不是首要目标 方法&#xff1a; 空间域增强&#xff1a;直接处理图象的象素 频率域增强&#xff1a;修改图象的傅立叶变换 评价&#xff1a;高度主观 视觉解…

学习Spring Boot:(二十五)使用 Redis 实现数据缓存

前言 由于 Ehcache 存在于单个 java 程序的进程中&#xff0c;无法满足多个程序分布式的情况&#xff0c;需要将多个服务器的缓存集中起来进行管理&#xff0c;需要一个缓存的寄存器&#xff0c;这里使用的是 Redis。 正文 当应用程序要去缓存中读取数据&#xff0c;但是缓存…

php ai库,收藏 | 深度学习框架、AI库、ML库、NLP库、CV库汇总!

一份包含深度学习框架、AI工具/库、机器学习工具/库、NLP工具/库、CV工具/库的汇总&#xff0c;并附有说明文档(有些是中英文文档都有)。之所以附带文档而不是源码&#xff0c;有两方面原因&#xff1a;先看文档&#xff0c;找出最适合自己的一个或两个(太多没必要&#xff0c;…

学习Spring Boot:(二十六)使用 RabbitMQ 消息队列

前言 前面学习了 RabbitMQ 基础&#xff0c;现在主要记录下学习 Spring Boot 整合 RabbitMQ &#xff0c;调用它的 API &#xff0c;以及中间使用的相关功能的记录。 相关的可以去[我的博客/RabbitMQ] 正文 我这里测试都是使用的是 topic 交换器&#xff0c;Spring Boot 2.…

appnode php,环境软件路径参考

[TOC]## Nginx* 主程序路径&#xff1a;/usr/sbin/nginx* 配置文件路径&#xff1a;/etc/nginx.conf* 服务控制命令&#xff1a;* CentOS 6&#xff1a;service nginx start|stop|reload|restart* CentOS 7&#xff1a;systemctl start|stop|reload|restart nginx.service## PH…

学习Spring Boot:(二十七)Spring Boot 2.0 中使用 Actuator

前言 主要是完成微服务的监控&#xff0c;完成监控治理。可以查看微服务间的数据处理和调用&#xff0c;当它们之间出现了异常&#xff0c;就可以快速定位到出现问题的地方。 springboot - version: 2.0 正文 依赖 maven 项目 在 pom.xml 文件中加入 actuator 的依赖&…

php实现注销功能,laravel 实现用户登录注销并限制功能

在项目根目录输入&#xff1a; php artisan make:controller Admin/LoginControllerphp artisan make:model Model/Admin -m运行之后 项目中会新增两个PHP文件新创建了admins用户表&#xff0c;此用户表默认新建中只有主键&#xff0c;创建时间&#xff0c;编辑时间。我们接下来…

将ipynb文件转为py的简单方法(图文并茂)

打开可以使用jupyter命令的命令窗口&#xff08;如果没有jupyter则需要先安装jupyter&#xff09;&#xff0c;cd 命令进入到 ipynb 文件所在的文件夹&#xff0c;执行 jupyter nbconvert --to script xxx.ipynb 即可完成 ipynb 文件到 py 文件的转化&#xff0c;执行 jupyter …

学习Spring Boot:(二十八)Spring Security 权限认证

前言 主要实现 Spring Security 的安全认证&#xff0c;结合 RESTful API 的风格&#xff0c;使用无状态的环境。 主要实现是通过请求的 URL &#xff0c;通过过滤器来做不同的授权策略操作&#xff0c;为该请求提供某个认证的方法&#xff0c;然后进行认证&#xff0c;授权成…

在PHP中如何要json中的数据,如何在不知道键值的情况下在php中读取JSON数据

我需要在php中读取firebase JSON URL然后显示它.我的firebase得到了以下.json数据&#xff1a;{"dDsdE4AlB7P5YYd4fWbYTQKCLPh1":{"email":"abhigmail.com","name":"abhishek"},"z1ceiLhdh9YVu7lGnVvqDWoWHFH3":{…

oracle 分区字符转换,Oracle 普通表与分区表转换

oracle 9i提供了dbms_redefinition包来实现数据库的表的在线重定义功能。在实际的应用上&#xff0c;我们可以利用这个包来进行&#xff1a;(1)堆表与分区之间进行转换。(2)重建表以减少HWM。10g能shrink&#xff0c;9i如果用move tablespace and rebuild index在move的时候会锁…

Java中使用有返回值的线程

在创建多线程程序的时候&#xff0c;我们常实现Runnable接口&#xff0c;Runnable没有返回值&#xff0c;要想获得返回值&#xff0c;Java5提供了一个新的接口Callable&#xff0c;可以获取线程中的返回值&#xff0c;但是获取线程的返回值的时候&#xff0c;需要注意&#xff…

Mybatis 插入时获取主键的方式

mybatis 作为一个主流的 ORM 框架&#xff0c;深受广大开发者的喜爱。有人的地方就有江湖&#xff0c;有代码的地方自然有坑&#xff0c;下面来说说获取 mybatis 的插入后返回的主键。 我们可以想一下自动增长的主键特性&#xff0c;在数据库里面肯定有某个地方管理 ID 的自增…

linux脚本怎么把文件地址变成动态地址,Linux脚本程序自动修改网卡配置文件中的MAC地址...

在玩Linux虚拟机的时候&#xff0c;一个安装好linux系统的virtual HDD会用于创建多个虚拟机&#xff0c;这样就不需要在创建每个虚拟机都安装一遍系统了。virtual HDD加载到虚拟机后&#xff0c;新的虚拟机的MAC地址就会和virtual系统中ifcfg-eth[0&#xff0d;9]中的MAC地址不…

MySQL + MyBatis 批量插入时存在则忽略或更新记录

一、存在时则忽略 为什么在发现重复时会忽略&#xff1f;这里面涉及到两个地方。 1、重复则忽略。那么首先是需要判断是否重复&#xff0c;这里是通过唯一索引判断是否重复的。如果表中唯一索引的字段已经存在与将要插入的记录行中唯一索引的字段值相同&#xff0c;则标识为重…

Linux 目录所属组设置,Linux系统用户与组管理命令及配置文件总结

一、Linux系统用户及组分类1、用户类别Linux系统中的用户大致可分为三类&#xff1a;root用户、系统用户、普通用户。每一个用户都拥有一个唯一的身份标识UID。2、组分类与用户信息对应的&#xff0c;Linux系统中的组也可分为三类&#xff1a;root组、系统组、普通组。每一个组…

linux 字符串 空,linux – bash空字符串/命令

你似乎把bash与其他一些编程语言混淆了.变量被替换,然后左边的内容被执行."$a"这是引号之间的a的内容. a是空的,所以这相当于&#xff1a;""那不是命令. “没有找到指令.”由于存在错误,执行不成功(shell返回代码不为0),因此命令的后半部分 – && …

@GetMapping和@PostMapping详解

首先要了解一下RequestMapping注解。 RequestMapping用于映射url到控制器类的一个特定处理程序方法。可用于方法或者类上面。也就是可以通过url找到对应的方法。 RequestMapping有8个属性。 value&#xff1a;指定请求的实际地址。 method&#xff1a;指定请求的method类型&…

实验楼 linux内核原理与分析,《Linux内核原理与分析》第一周作业 20189210

实验一 Linux系统简介这一节主要学习了Linux的历史&#xff0c;Linux有关的重要人物以及学习Linux的方法&#xff0c;Linux和Windows的区别。其中学到了LInux中的应用程序大都为开源自由的软件&#xff0c;用户可以修改定制再发布&#xff1b;内核是实现多任务运行和硬件管理的…

MySQL的INSERT INTO··· ON DUPLICATE KEY UPDATE使用的几种情况

保存或更新 在MySQL数据库中&#xff0c;如果在insert语句后面带上ON DUPLICATE KEY UPDATE 子句&#xff0c;而要插入的行与表中现有记录的惟一索引或主键中产生重复值&#xff0c;那么就会发生旧行的更新&#xff1b;如果插入的行数据与现有表中记录的唯一索引或者主键不重复…