六、spring boot 1.5.4 配置多數據源

来源:http://www.cnblogs.com/hdwang/archive/2017/06/17/7041096.html
-Advertisement-
Play Games

spring boot 已經支持多數據源配置了,無需網上好多那些編寫什麼類的,特別麻煩,看看如下解決方案,官方的,放心! 1.首先定義數據源配置 3.Repository數據持久層 ...


spring boot 已經支持多數據源配置了,無需網上好多那些編寫什麼類的,特別麻煩,看看如下解決方案,官方的,放心!

 

1.首先定義數據源配置

#=====================multiple database config============================
#ds1
first.datasource.url=jdbc:mysql://localhost/test?characterEncoding=utf8&useSSL=true
first.datasource.username=root
first.datasource.password=123456
first.datasource.driver-class-name=com.mysql.jdbc.Driver
first.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
first.datasource.max-wait=10000
first.datasource.max-active=200
first.datasource.test-on-borrow=true
first.datasource.initial-size=10

#ds2
second.datasource.url=jdbc:mysql://localhost/test2?characterEncoding=utf8&useSSL=true
second.datasource.username=root
second.datasource.password=123456
second.datasource.driver-class-name=com.mysql.jdbc.Driver
second.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
second.datasource.max-wait=10000
second.datasource.max-active=200
second.datasource.test-on-borrow=true
second.datasource.initial-size=10

#=====================jpa config================================
#實體類維護資料庫表結構的具體行為:update/create/create-drop/validate/none
spring.jpa.hibernate.ddl-auto=none
#列印sql語句
spring.jpa.show-sql=true
#格式化輸出的json字元串
spring.jackson.serialization.indent_output=true


2.配置ds1的相關註入對象和啟用jpa支持
/**
 * Created by hdwang on 2017-06-16.
 * 第一個數據源配置
 * If you are using Spring Data, you need to configure @EnableJpaRepositories
 */
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.hdwang.dao.datajpa.firstDs",entityManagerFactoryRef = "firstEntityManagerFactory",transactionManagerRef="firstTransactionManager")
public class FirstDsConfig {

    /**
     * 數據源配置對象
     * Primary 表示預設的對象,Autowire可註入,不是預設的得明確名稱註入
     * @return
     */
    @Bean
    @Primary
    @ConfigurationProperties("first.datasource")
    public DataSourceProperties firstDataSourceProperties() {
        return new DataSourceProperties();
    }

    /**
     * 數據源對象
     * @return
     */
    @Bean
    @Primary
    @ConfigurationProperties("first.datasource")
    public DataSource firstDataSource() {
        return firstDataSourceProperties().initializeDataSourceBuilder().build();
    }

    /**
     * 實體管理對象
     * @param builder 由spring註入這個對象,首先根據type註入(多個就取聲明@Primary的對象),否則根據name註入
     * @return
     */
    @Bean
    @Primary
    public LocalContainerEntityManagerFactoryBean firstEntityManagerFactory(
            EntityManagerFactoryBuilder builder) {
        return builder
                .dataSource(firstDataSource())
                .packages("com.hdwang.entity.dbFirst")
                .persistenceUnit("firstDs")
                .build();
    }

    /**
     * 事務管理對象
     * @return
     */
    @Bean(name = "firstTransactionManager")
    @Primary
    public PlatformTransactionManager transactionManager(EntityManagerFactory emf){
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(emf);
        return transactionManager;
    }

    @Bean
    @Primary
    public JdbcTemplate jdbcTemplate(){
        return new JdbcTemplate(firstDataSource());
    }

    @Bean
    @Primary
    public TransactionTemplate transactionTemplate(PlatformTransactionManager platformTransactionManager){
        return new TransactionTemplate(platformTransactionManager);
    }
}

 

相關知識點:
1.使用@Bean可以創建一個bean對象交給spring容器管理
2.@Bean創建的bean對象的名稱預設為方法名,也可以指定
3.@Bean方法參數表示,接收一個bean對象,預設按照type類型接收註入的對象,若要修改為byName方式,可以使用@Qualifier註解註入準確的對象
4.@Primary表示該bean為此類型的預設bean,在其他地方引用的時候用@Autowired即可按照類型註入,不受同類型多個對象影響
5.EnableJpaRepositories表示啟用spring data jpa的支持,也就是jpa的新使用方式,註意basePackages指的事 @Repository介面的所在包位置,可配置多個
其他註解就不清楚了!

2.配置ds2的相關註入對象和啟用jpa支持
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.hdwang.dao.datajpa.secondDs", entityManagerFactoryRef = "secondEntityManagerFactory",transactionManagerRef = "secondTransactionManager")
public class SecondDsConfig {

    @Bean
    @ConfigurationProperties("second.datasource")
    public DataSourceProperties secondDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    @ConfigurationProperties("second.datasource")
    public DataSource secondDataSource() {
        return secondDataSourceProperties().initializeDataSourceBuilder().build();
    }

    /**
     * 實體管理對象
     * @param builder  由spring註入這個對象,首先根據type註入(多個就取聲明@Primary的對象),否則根據name註入
     * @return
     */
    @Bean
    public LocalContainerEntityManagerFactoryBean secondEntityManagerFactory(
            EntityManagerFactoryBuilder builder) {
        return builder
                .dataSource(secondDataSource())
                .packages("com.hdwang.entity.dbSecond")
                .persistenceUnit("secondDs")
                .build();
    }

    /**
     * 事物管理對象
     * @param secondEntityManagerFactory 實體管理工廠對象(按照名稱註入)
     * @return 平臺事物管理器
     */
    @Bean(name = "secondTransactionManager")
    public PlatformTransactionManager transactionManager(@Qualifier("secondEntityManagerFactory")LocalContainerEntityManagerFactoryBean secondEntityManagerFactory){
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(secondEntityManagerFactory.getObject());
        return transactionManager;
    }

    @Bean(name="jdbcTemplate2")
    public JdbcTemplate jdbcTemplate(){
        return new JdbcTemplate(secondDataSource());
    }

    @Bean(name = "transactionTemplate2")
    public TransactionTemplate transactionTemplate(@Qualifier("secondTransactionManager")PlatformTransactionManager transactionManager){
        return new TransactionTemplate(transactionManager);
    }
}

 

 

3.Repository數據持久層

package com.hdwang.dao.datajpa.firstDs;

@Repository
public interface UserRepository extends JpaRepository<User, Integer> {
    /**
     * spring data jpa 會自動註入實現(根據方法命名規範)
     * @return
     */
    User findByNumber(String number);


    @Modifying
    @Query("delete from User u where u.id = :id")
    void deleteUser(@Param("id")int id);
}
package com.hdwang.dao.datajpa.secondDs;

@Repository
public interface OrderRepository extends JpaRepository<Order, Integer> {
    /**
     * spring data jpa 會自動註入實現(根據方法命名規範)
     * @return
     */
    User findByNumber(String number);


    @Modifying
    @Query("delete from Order o where o.id = :id")
    void deleteUser(@Param("id") int id);
}

 

上面兩個介面分屬兩個數據源,在@EnableJpaRepositories配置好後,這裡就可以正確操作相應的數據源了


4.Service服務層,註意事物(介面我就不貼了)
@Service
@Transactional("firstTransactionManager")
public class UserServiceImpl implements UserService {

    @Autowired
    private UserRepository userRepository;

    @Override
    public User findById(int id) {
        return this.userRepository.findOne(id);
    }

    @Override
    public User findByNumber(String number) {
        return this.userRepository.findByNumber(number);
    }

    @Override
    public List<User> findAllUserByPage(int page,int size) {
        Pageable pageable = new PageRequest(page, size);
        Page<User> users =  this.userRepository.findAll(pageable);
        return users.getContent();
    }

    @Override
    public User updateUser(User user,boolean throwEx) {
        User userNew = this.userRepository.save(user);
        if(throwEx){
            throw new RuntimeException("throw a ex");
        }
        return userNew;
    }

    @Override
    public void deleteUser(int id) {
        this.userRepository.deleteUser(id);
    }
}
@Service
@Transactional("secondTransactionManager")
public class OrderServiceImpl implements OrderService {

    @Autowired
    private OrderRepository orderRepository;


    @Override
    public Order findById(int id) {
        return this.orderRepository.findOne(id);
    }

    @Override
    public Order updateOrder(Order order, boolean throwEx) {
        Order orderNew = this.orderRepository.save(order);
        if(throwEx){
            throw new RuntimeException("throw a ex");
        }
        return orderNew;
    }
}

 



知識擴展

1.如果採用傳統jpa方式,@EnableJpaRepositories無需配置,配置了也無影響。實現方式如下:

ds1相關DaoImpl
@PersistenceContext
private EntityManager entityManager;

ds2相關DaoImpl
@PersistenceContext(unitName = "secondDs")
private EntityManager entityManager;

因為ds1的entityManger聲明瞭@Primary,所以無需指明unitName,ds2必須指明。註入了準確的entityManager,就可以直接拿來操作資料庫了。service層和上面一樣的,@Transactional("xxxManager")指明事物管理器即可!


2.採用jdbcTemplate方式,直接註入到Service層對象即可,so easy!
@Autowired
private JdbcTemplate jdbcTemplate;

@Autowired
private TransactionTemplate transactionTemplate;

@Resource(name="jdbcTemplate2")
private JdbcTemplate jdbcTemplate2;

@Resource(name="transactionTemplate2")
private TransactionTemplate transactionTemplate2;


好了,spring boot 多數據源,完美解決! 而且三種資料庫操作方法均支持,包括事物。已經經過實踐證明瞭! 這是官方給出的最佳實踐,只是官方文檔沒寫細。導致整整坑了我幾天。至此,spring boot框架的使用就告一段落了!






您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、線性表 原理:零個或多個同類數據元素的有限序列 原理圖: 特點 : 1、有序性 2、有限性 3、同類型元素 4、第一個元素無前驅,最後一個元素無後繼,中間的元素有一個前驅並且有一個後繼 線性表是一種邏輯上的數據結構,在物理上一般有兩種實現 順序實現和鏈表實現 二、基於數組的 線性表順序實現 原理 ...
  • 文件上傳 配置伺服器虛擬地址: 文件獲取與存儲 獲取伺服器虛擬目錄上的文件 文件獲取與存儲 獲取伺服器虛擬目錄上的文件 獲取伺服器虛擬目錄上的文件 ...
  • 文件編碼: ①gbk編碼:中文占用2個位元組,英文占用1個位元組 File類常用API的使用: file類的遍歷目錄 RomdonAccessFile基本操作 五、位元組流 ...
  • 裝飾器 裝飾器本質上是一個Python函數,它可以讓其他函數在不需要做任何代碼變動的前提下增加額外功能,裝飾器的返回值也是一個函數對象。 先看簡單例子: 現有一個新的需求,希望可以記錄下函數的運行時間,需要在代碼中計算時間的代碼: login()等多個函數也有類型的需求,怎麼做?若在每個函數內都寫一 ...
  • 題目背景 嘛,這道非常簡單的給大家提供信心的省選題洛谷居然沒有! 這麼簡單的題怎麼可以沒有! 給大家提升士氣是義不容辭的責任! 所以我就來補一下啦.. 值得一提的是,標程是我自己做的.. 很渣,因為數據很水所以能AC.. 大神勿噴.. 題目描述 有 m 個小組, n 個元素,每個元素屬於且僅屬於一個 ...
  • 數學操作符 字元串操作符 3種基本數據類型及其轉換函數 其他函數 ...
  • 題目描述 現在有一堆數字共N個數字(N<=10^6),以及一個大小為k的視窗。現在這個從左邊開始向右滑動,每次滑動一個單位,求出每次滑動後視窗中的最大值和最小值。 例如: The array is [1 3 -1 -3 5 3 6 7], and k = 3. 輸入輸出格式 輸入格式: 輸入一共有兩 ...
  • 介紹一下scrapy 爬蟲框架 安裝方法 pip install scrapy 就可以實現安裝了。我自己用anaconda 命令為conda install scrapy。 1 Engine從Spider處獲得爬取請求(Request)2Engine將爬取請求轉發給Scheduler,用於調度 3 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...