Spring Boot多数据源配置与使用
来源:互联网 发布:大数据顾客需求 编辑:程序博客网 时间:2024/06/04 18:51
之前在介绍使用JdbcTemplate和Spring-data-jpa时,都使用了单数据源。在单数据源的情况下,Spring Boot的配置非常简单,只需要在application.properties
文件中配置连接参数即可。但是往往随着业务量发展,我们通常会进行数据库拆分或是引入其他数据库,从而我们需要配置多个数据源,下面基于之前的JdbcTemplate和Spring-data-jpa例子分别介绍两种多数据源的配置方式。
多数据源配置
创建一个Spring配置类,定义两个DataSource用来读取application.properties
中的不同配置。如下例子中,主数据源配置为spring.datasource.primary
开头的配置,第二数据源配置为spring.datasource.secondary
开头的配置。
1234567891011121314151617181920
public class DataSourceConfig {"primaryDataSource")(name ="primaryDataSource")("spring.datasource.primary")(prefix=public DataSource primaryDataSource() {return DataSourceBuilder.create().build();}"secondaryDataSource")(name ="secondaryDataSource")("spring.datasource.secondary")(prefix=public DataSource secondaryDataSource() {return DataSourceBuilder.create().build();}}
对应的application.properties
配置如下:
123456789
spring.datasource.primary.url=jdbc:mysql://localhost:3306/test1spring.datasource.primary.username=rootspring.datasource.primary.password=rootspring.datasource.primary.driver-class-name=com.mysql.jdbc.Driverspring.datasource.secondary.url=jdbc:mysql://localhost:3306/test2spring.datasource.secondary.username=rootspring.datasource.secondary.password=rootspring.datasource.secondary.driver-class-name=com.mysql.jdbc.Driver
JdbcTemplate支持
对JdbcTemplate的支持比较简单,只需要为其注入对应的datasource即可,如下例子,在创建JdbcTemplate的时候分别注入名为primaryDataSource
和secondaryDataSource
的数据源来区分不同的JdbcTemplate。
123456789101112
"primaryJdbcTemplate")(name =public JdbcTemplate primaryJdbcTemplate(@Qualifier("primaryDataSource") DataSource dataSource) {return new JdbcTemplate(dataSource);}"secondaryJdbcTemplate")(name =public JdbcTemplate secondaryJdbcTemplate(@Qualifier("secondaryDataSource") DataSource dataSource) {return new JdbcTemplate(dataSource);}
接下来通过测试用例来演示如何使用这两个针对不同数据源的JdbcTemplate。
123456789101112131415161718192021222324252627282930313233343536373839
(SpringJUnit4ClassRunner.class)(Application.class)public class ApplicationTests {"primaryJdbcTemplate")(protected JdbcTemplate jdbcTemplate1;"secondaryJdbcTemplate")(protected JdbcTemplate jdbcTemplate2;public void setUp() {jdbcTemplate1.update("DELETE FROM USER ");jdbcTemplate2.update("DELETE FROM USER ");}public void test() throws Exception {// 往第一个数据源中插入两条数据jdbcTemplate1.update("insert into user(id,name,age) values(?, ?, ?)", 1, "aaa", 20);jdbcTemplate1.update("insert into user(id,name,age) values(?, ?, ?)", 2, "bbb", 30);// 往第二个数据源中插入一条数据,若插入的是第一个数据源,则会主键冲突报错jdbcTemplate2.update("insert into user(id,name,age) values(?, ?, ?)", 1, "aaa", 20);// 查一下第一个数据源中是否有两条数据,验证插入是否成功Assert.assertEquals("2", jdbcTemplate1.queryForObject("select count(1) from user", String.class));// 查一下第一个数据源中是否有两条数据,验证插入是否成功Assert.assertEquals("1", jdbcTemplate2.queryForObject("select count(1) from user", String.class));}}
完整示例:Chapter3-2-3
Spring-data-jpa支持
对于数据源的配置可以沿用上例中DataSourceConfig
的实现。
新增对第一数据源的JPA配置,注意两处注释的地方,用于指定数据源对应的Entity
实体和Repository
定义位置,用@Primary
区分主数据源。
123456789101112131415161718192021222324252627282930313233343536373839404142
(entityManagerFactoryRef="entityManagerFactoryPrimary",transactionManagerRef="transactionManagerPrimary",basePackages= { "com.didispace.domain.p" }) //设置Repository所在位置public class PrimaryConfig {"primaryDataSource")(private DataSource primaryDataSource;"entityManagerPrimary")(name =public EntityManager entityManager(EntityManagerFactoryBuilder builder) {return entityManagerFactoryPrimary(builder).getObject().createEntityManager();}"entityManagerFactoryPrimary")(name =public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary (EntityManagerFactoryBuilder builder) {return builder.dataSource(primaryDataSource).properties(getVendorProperties(primaryDataSource)).packages("com.didispace.domain.p") //设置实体类所在位置.persistenceUnit("primaryPersistenceUnit").build();}private JpaProperties jpaProperties;private Map<String, String> getVendorProperties(DataSource dataSource) {return jpaProperties.getHibernateProperties(dataSource);}"transactionManagerPrimary")(name =public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());}}
新增对第二数据源的JPA配置,内容与第一数据源类似,具体如下:
123456789101112131415161718192021222324252627282930313233343536373839
(entityManagerFactoryRef="entityManagerFactorySecondary",transactionManagerRef="transactionManagerSecondary",basePackages= { "com.didispace.domain.s" }) //设置Repository所在位置public class SecondaryConfig {"secondaryDataSource")(private DataSource secondaryDataSource;"entityManagerSecondary")(name =public EntityManager entityManager(EntityManagerFactoryBuilder builder) {return entityManagerFactorySecondary(builder).getObject().createEntityManager();}"entityManagerFactorySecondary")(name =public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary (EntityManagerFactoryBuilder builder) {return builder.dataSource(secondaryDataSource).properties(getVendorProperties(secondaryDataSource)).packages("com.didispace.domain.s") //设置实体类所在位置.persistenceUnit("secondaryPersistenceUnit").build();}private JpaProperties jpaProperties;private Map<String, String> getVendorProperties(DataSource dataSource) {return jpaProperties.getHibernateProperties(dataSource);}"transactionManagerSecondary")(name =PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) {return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject());}}
完成了以上配置之后,主数据源的实体和数据访问对象位于:com.didispace.domain.p
,次数据源的实体和数据访问接口位于:com.didispace.domain.s
。
分别在这两个package下创建各自的实体和数据访问接口
- 主数据源下,创建User实体和对应的Repository接口
1234567891011121314151617181920212223
public class User {private Long id;false)(nullable =private String name;false)(nullable =private Integer age;public User(){}public User(String name, Integer age) {this.name = name;this.age = age;}// 省略getter、setter}
123
public interface UserRepository extends JpaRepository<User, Long> {}
- 从数据源下,创建Message实体和对应的Repository接口
1234567891011121314151617181920212223
public class Message {private Long id;false)(nullable =private String name;false)(nullable =private String content;public Message(){}public Message(String name, String content) {this.name = name;this.content = content;}// 省略getter、setter}
123
public interface MessageRepository extends JpaRepository<Message, Long> {}
接下来通过测试用例来验证使用这两个针对不同数据源的配置进行数据操作。
1234567891011121314151617181920212223242526272829
(SpringJUnit4ClassRunner.class)(Application.class)public class ApplicationTests {private UserRepository userRepository;private MessageRepository messageRepository;public void test() throws Exception {userRepository.save(new User("aaa", 10));userRepository.save(new User("bbb", 20));userRepository.save(new User("ccc", 30));userRepository.save(new User("ddd", 40));userRepository.save(new User("eee", 50));Assert.assertEquals(5, userRepository.findAll().size());messageRepository.save(new Message("o1", "aaaaaaaaaa"));messageRepository.save(new Message("o2", "bbbbbbbbbb"));messageRepository.save(new Message("o3", "cccccccccc"));Assert.assertEquals(3, messageRepository.findAll().size());}}
- Spring Boot多数据源配置与使用
- Spring Boot多数据源配置与使用
- Spring Boot多数据源配置与使用
- Spring Boot多数据源配置与使用
- Spring Boot多数据源配置与使用
- Spring Boot多数据源配置与使用
- Spring Boot多数据源配置与使用
- Spring Boot多数据源配置与使用
- spring-boot 使用 spring-data-jpa多数据源配置
- spring boot中使用druid多数据源配置Mybatis
- spring boot 教程(六)多数据源配置与使用
- spring boot Mybatis多数据源配置
- spring boot多数据源配置
- spring boot 多数据源配置
- spring boot + mybatis 多数据源配置
- Spring Boot多数据源配置
- Spring boot配置多数据源
- 基于Spring Boot与Spring Data JPA的多数据源配置
- 设计模式之原型模式(Prototype)
- 理解LinkedHashMap
- MongoDB 学习笔记
- qt5.8的安装及c++11的配置
- 解决Ubuntu 14.04挂起后,再次唤醒后显示网络已禁用
- Spring Boot多数据源配置与使用
- linux 服务器 usr目录用满 解决AMH面板环境mysql-bin数据库日志文件占用硬盘资源
- hdu2051(stack)
- 32位Windows7系统无法启动,提示找不到“Windows\system32\config\system”文件
- 【LeetCode】数独系列
- spring IOC容器初始化和注入
- Java Volatile transient 关键字
- 数据库中树结构数据,转换为Java对象树结构( 多叉树结构 )
- 用Python实现算法导论中的算法 序