springboot多數據源配置

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。

之前在介紹使用JdbcTemplate和Spring-data-jpa時,都使用了單數據源。在單數據源的情況下,Spring Boot的配置非常簡單,只需要在application.properties文件中配置連接參數即可。但是往往隨著業務量發展,我們通常會進行數據庫拆分或是引入其他數據庫,從而我們需要配置多個數據源,下面基于之前的JdbcTemplate和Spring-data-jpa例子分別介紹兩種多數據源的配置方式。

多數據源配置

創建一個Spring配置類,定義兩個DataSource用來讀取application.properties中的不同配置。如下例子中,主數據源配置為spring.datasource.primary開頭的配置,第二數據源配置為spring.datasource.secondary開頭的配置。


@Configuration
public class DataSourceConfig { @Bean(name = "primaryDataSource") @Qualifier("primaryDataSource") @ConfigurationProperties(prefix="spring.datasource.primary") public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "secondaryDataSource") @Qualifier("secondaryDataSource") @Primary @ConfigurationProperties(prefix="spring.datasource.secondary") public DataSource secondaryDataSource() { return DataSourceBuilder.create().build(); } }

對應的application.properties配置如下:

spring.datasource.primary.url=jdbc:mysql://localhost:3306/test1
spring.datasource.primary.username=root
spring.datasource.primary.password=root
spring.datasource.primary.driver-class-name=com.mysql.jdbc.Driverspring.datasource.secondary.url=jdbc:mysql://localhost:3306/test2
spring.datasource.secondary.username=root
spring.datasource.secondary.password=root
spring.datasource.secondary.driver-class-name=com.mysql.jdbc.Driver

JdbcTemplate支持

對JdbcTemplate的支持比較簡單,只需要為其注入對應的datasource即可,如下例子,在創建JdbcTemplate的時候分別注入名為primaryDataSourcesecondaryDataSource的數據源來區分不同的JdbcTemplate。


    @Bean(name = "primaryJdbcTemplate")public JdbcTemplate primaryJdbcTemplate( @Qualifier("primaryDataSource") DataSource dataSource) { return new JdbcTemplate(dataSource); } @Bean(name = "secondaryJdbcTemplate") public JdbcTemplate secondaryJdbcTemplate( @Qualifier("secondaryDataSource") DataSource dataSource) { return new JdbcTemplate(dataSource); }

接下來通過測試用例來演示如何使用這兩個針對不同數據源的JdbcTemplate。


@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(Application.class)
public class ApplicationTests { @Autowired @Qualifier("primaryJdbcTemplate") protected JdbcTemplate jdbcTemplate1; @Autowired @Qualifier("secondaryJdbcTemplate") protected JdbcTemplate jdbcTemplate2; @Before public void setUp() { jdbcTemplate1.update("DELETE FROM USER "); jdbcTemplate2.update("DELETE FROM USER "); } @Test 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區分主數據源。


@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef="entityManagerFactoryPrimary",transactionManagerRef="transactionManagerPrimary",basePackages= { "com.didispace.domain.p" }) //設置Repository所在位置 public class PrimaryConfig { @Autowired @Qualifier("primaryDataSource") private DataSource primaryDataSource; @Primary @Bean(name = "entityManagerPrimary") public EntityManager entityManager(EntityManagerFactoryBuilder builder) { return entityManagerFactoryPrimary(builder).getObject().createEntityManager(); } @Primary @Bean(name = "entityManagerFactoryPrimary") public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary (EntityManagerFactoryBuilder builder) { return builder .dataSource(primaryDataSource) .properties(getVendorProperties(primaryDataSource)) .packages("com.didispace.domain.p") //設置實體類所在位置 .persistenceUnit("primaryPersistenceUnit") .build(); } @Autowired private JpaProperties jpaProperties; private Map<String, String> getVendorProperties(DataSource dataSource) { return jpaProperties.getHibernateProperties(dataSource); } @Primary @Bean(name = "transactionManagerPrimary") public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) { return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject()); } }

新增對第二數據源的JPA配置,內容與第一數據源類似,具體如下:


@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef="entityManagerFactorySecondary",transactionManagerRef="transactionManagerSecondary",basePackages= { "com.didispace.domain.s" }) //設置Repository所在位置 public class SecondaryConfig { @Autowired @Qualifier("secondaryDataSource") private DataSource secondaryDataSource; @Bean(name = "entityManagerSecondary") public EntityManager entityManager(EntityManagerFactoryBuilder builder) { return entityManagerFactorySecondary(builder).getObject().createEntityManager(); } @Bean(name = "entityManagerFactorySecondary") public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary (EntityManagerFactoryBuilder builder) { return builder .dataSource(secondaryDataSource) .properties(getVendorProperties(secondaryDataSource)) .packages("com.didispace.domain.s") //設置實體類所在位置 .persistenceUnit("secondaryPersistenceUnit") .build(); } @Autowired private JpaProperties jpaProperties; private Map<String, String> getVendorProperties(DataSource dataSource) { return jpaProperties.getHibernateProperties(dataSource); } @Bean(name = "transactionManagerSecondary") PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) { return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject()); } }

完成了以上配置之后,主數據源的實體和數據訪問對象位于:com.didispace.domain.p,次數據源的實體和數據訪問接口位于:com.didispace.domain.s

分別在這兩個package下創建各自的實體和數據訪問接口

  • 主數據源下,創建User實體和對應的Repository接口

@Entity
public class User { @Id @GeneratedValue private Long id; @Column(nullable = false) private String name; @Column(nullable = false) private Integer age; public User(){} public User(String name, Integer age) { this.name = name; this.age = age; } // 省略getter、setter }

public interface UserRepository extends JpaRepository<User, Long> { }
  • 從數據源下,創建Message實體和對應的Repository接口

@Entity
public class Message { @Id @GeneratedValue private Long id; @Column(nullable = false) private String name; @Column(nullable = false) private String content; public Message(){} public Message(String name, String content) { this.name = name; this.content = content; } // 省略getter、setter }

public interface MessageRepository extends JpaRepository<Message, Long> { }

接下來通過測試用例來驗證使用這兩個針對不同數據源的配置進行數據操作。


@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(Application.class)
public class ApplicationTests { @Autowired private UserRepository userRepository; @Autowired private MessageRepository messageRepository; @Test 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()); } } 原文見:https://www.cnblogs.com/fengmao/p/7538854.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/449832.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449832.shtml
英文地址,請注明出處:http://en.pswp.cn/news/449832.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

pyhon量化數據處理小細節3---日期格式轉換

不同的數據文檔&#xff0c;會獲得不同日期格式&#xff0c;常見的有str(20200101),datetime(20200101),又或者是2020-01-01&#xff0c;,2020-1-1,20-1-1&#xff0c;20-Apr_20th,2020/01/01,20/01/01等等&#xff0c;總之類型很多。因此需要我們對日期格式進行統一化。這里我…

面向對象和基于對象

面向對象大家都很熟悉&#xff0c;可是基于對象就不一定了。兩個聽起來好象是同一回事&#xff0c;而事實上它們卻千差萬別。基于對象是指&#xff1a;我們采用對象封裝技術&#xff0c;將數據和操作捆綁在一起&#xff0c;但是并沒有合理地使用多態、繼承等面向對象技術進行軟…

CSS margin 屬性簡介

CSS margin 屬性 設置外邊距的最簡單的方法就是使用 margin 屬性。 margin 屬性接受任何長度單位&#xff0c;可以是像素、英寸、毫米或 em。 margin 可以設置為 auto。更常見的做法是為外邊距設置長度值。下面的聲明在 h1 元素的各個邊上設置了 1/4 英寸寬的空白&#xff1a;h…

MVC中使用代碼創建數據庫(code first +mysql+EF)

1.新建一個mvc項目 2.安裝mysql需要的幾個文件 EntityFramework、MySql.Data&#xff08;6.9.12&#xff09;和MySql.Data.Entity &#xff08;6.9.12&#xff09; 這里有幾點要注意 1.MySql.Data和MySql.Data.Entity 版本必須一致 2.我試用了6.10的版本 要報錯 3.我測試沒有問…

github 學習使用

博主第一次使用github&#xff0c;所以會將過程全成描述歡迎使用Github注冊安裝進入倉庫&#xff0c;創建、修改、上傳文件。強制推送強制覆蓋上傳文件歡迎使用Github 注冊 直接進入github官網&#xff1a;https://github.com 點擊sigh up 進行注冊 直接填寫即可然后驗證通過…

Java中9大內置基本數據類型Class實例和數組的Class實例

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1、Java中9大內置幾本數據類型&#xff1a; 對于對象來說,可以直接使用對象.getClass()或者Class.forName(className);、類名.class都可以…

軟件質量管理之困境與對策思考

相信在不少與軟件開發相關的企業內&#xff0c;質量管理部門與軟件開發部門在日常運作中形成了如下圖所示的“啞鈴形”組織結構。 開發部門執行質量管理部門所制定的流程&#xff0c;通過提供證據的形式將各種流程執行后的數據反饋給質量管理部門&#xff08;包括缺陷率和各種流…

GDI+用PNG圖片做半透明異型窗口

{*******************************************************}{ }{ GDI用PNG圖片做半透明異型窗口 }{ }{ 版權所有 (C) 2008 QQ:…

java Spring Boot中使用Swagger2構建API文檔

1、添加Swagger2的依賴 在pom.xml中加入Swagger2的依賴 <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.2.2</version> </dependency> <dependency><groupId&g…

什么是 FreeMarker

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 轉自官方文檔&#xff0c;只是記錄下官方在線手冊地址&#xff1a;http://freemarker.foofun.cn/ FreeMarker 是一款 模板引擎&#xff…

TP函數

U方法用于完成對URL地址的組裝&#xff0c;特點在于可以自動根據當前的URL模式和設置生成對應的URL地址&#xff0c;格式為&#xff1a;U(地址,參數,偽靜態,是否跳轉,顯示域名);在模板中使用U方法而不是固定寫死URL地址的好處在于&#xff0c;一旦你的環境變化或者參數設置改變…

爬蟲——————爬取中金所,深交所,上交所期權數據

先從深交所開始&#xff1a;直接上傳源碼&#xff1a; from bs4 import BeautifulSoup from lxml import etree import pandas as pd import akshare as ak import datetime import requests import csv from contextlib import closing import time from urllib.request impo…

linux下的C語言開發

linux下的C語言開發&#xff08;開篇&#xff09; 在很多人的眼里&#xff0c;C語言和linux常常是分不開的。這其中的原因很多&#xff0c;其中最重要的一部分我認為是linux本身就是C語言的杰出作品。當然&#xff0c;linux操作系統本身對C語言的支持也是相當到位的。作為一個…

sql語法學習

本人數據庫目前使用的是sql&#xff0c;主要是使用python語言&#xff0c;然后用pandas調用&#xff08;真的很方便&#xff09;。所以就總結一下&#xff0c;也為自己以后調用數據查找方便使用。 導入包 from sqlalchemy import create_engine import pymssql連接數據庫 con…

C 溫故知新 之 指針:數組指針、字符串指針、函數指針

一、數組指針 1.指向數組元素的指針 1、定義&#xff1a;還是那句話通俗的說指針就是地址   數組指針 &#xff1a;數組的起始地址 數組元素指針&#xff1a;數組元素的地址 2、定義一個指向數組元素的指針變量的方法&#xff0c;與之前介紹的指針變量相同。 例如&#…

mysql 查找配置文件 my.ini 位置方法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 個人備注&#xff1a;不顯示文件類型時&#xff0c;my.ini 文件名就叫作 my&#xff0c; 文件屬性才顯示 ini。 找到 my 文件看屬性就知…

嵌入式操作系統內核原理和開發

嵌入式操作系統內核原理和開發&#xff08;開篇&#xff09; 操作系統是很多人每天必須打交道的東西&#xff0c;因為在你打開電腦的一剎那&#xff0c;隨著bios自檢結束&#xff0c;你的windows系統已經開始運行了。如果問大家操作系統是什么&#xff1f;可能有的人會說操作…

Java中對象比較

在Java之中不僅僅存在兩個數字與兩個字符串之間的比較&#xff0c;還存在兩個對象之間的比較。 眾所周知&#xff0c;兩個數字之間的比較我們使用“”&#xff0c;兩個字符串之間的比較我們使用“equals()”&#xff0c;那么兩個對象之間如何進行比較呢&#xff1f;既然要進行兩…

如何安裝pfbprophet

最近facebook出來了一個軟件包&#xff0c;可以用于時序數據預測&#xff0c;但是安裝上&#xff0c;遇到問題不小&#xff0c;本人也在安裝中遇到大大小小各種問題&#xff0c;然后查了各種資料&#xff0c;進行研究&#xff0c;終于找到一個最簡單的辦法。 不廢話&#xff0…

JeeSite 4.0 (1.0)開發環境部署運行

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 環境要求 1、Java SDK 1.8 下載 2、Eclipse IDE for Java EE Mars 2 (4.5.2) 下載&#xff08;依Eclipse舉例&#xff0c;IDEA雷同。&…