首頁 Java java教程 java之spring boot 1.5.4 配置多重資料來源

java之spring boot 1.5.4 配置多重資料來源

Jun 26, 2017 am 11:42 AM
boot spring 資料來源 配置

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
    @Primarypublic LocalContainerEntityManagerFactoryBean firstEntityManagerFactory(
            EntityManagerFactoryBuilder builder) {return builder
                .dataSource(firstDataSource())
                .packages("com.hdwang.entity.dbFirst")
                .persistenceUnit("firstDs")
                .build();
    }/** * 事务管理对象
     * @return */@Bean(name = "firstTransactionManager")
    @Primarypublic PlatformTransactionManager transactionManager(EntityManagerFactory emf){
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(emf);return transactionManager;
    }

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

    @Bean
    @Primarypublic 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 */@Beanpublic 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;

@Repositorypublic 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;

@Repositorypublic 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 {

    @Autowiredprivate UserRepository userRepository;

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

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

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

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

    @Overridepublic void deleteUser(int id) {this.userRepository.deleteUser(id);
    }
}
登入後複製
@Service@Transactional("secondTransactionManager")public class OrderServiceImpl implements OrderService {

    @Autowiredprivate OrderRepository orderRepository;


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

    @Overridepublic 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框架的使用就告一段落了!
登入後複製
<br>
登入後複製
<br><br>
登入後複製
登入後複製
<br><br>
登入後複製
登入後複製

以上是java之spring boot 1.5.4 配置多重資料來源的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1422
52
Laravel 教程
1316
25
PHP教程
1267
29
C# 教程
1239
24
Linux系統中GDM的工作原理及配置方法 Linux系統中GDM的工作原理及配置方法 Mar 01, 2024 pm 06:36 PM

標題:Linux系統中GDM的工作原理及設定方法在Linux作業系統中,GDM(GNOMEDisplayManager)是一種常見的顯示管理器,用於控制圖形使用者介面(GUI)登入和使用者會話管理。本文將介紹GDM的工作原理和設定方法,以及提供具體的程式碼範例。一、GDM的工作原理GDM是GNOME桌面環境下的顯示管理器,負責啟動X伺服器並提供登入介面,使用者輸

利用Spring Boot以及Spring AI建構生成式人工智慧應用 利用Spring Boot以及Spring AI建構生成式人工智慧應用 Apr 28, 2024 am 11:46 AM

Spring+AI作為行業領導者,透過其強大、靈活的API和先進的功能,為各種行業提供了領先性的解決方案。在本專題中,我們將深入探討Spring+AI在各領域的應用範例,每個案例都將展示Spring+AI如何滿足特定需求,實現目標,並將這些LESSONSLEARNED擴展到更廣泛的應用。希望這個專題能對你有所啟發,更深入地理解和利用Spring+AI的無限可能。 Spring框架在軟體開發領域已經有超過20年的歷史,自SpringBoot1.0版本發布以來已有10年。現在,無人會質疑,Spring

了解Linux Bashrc:功能、設定與使用方法 了解Linux Bashrc:功能、設定與使用方法 Mar 20, 2024 pm 03:30 PM

了解LinuxBashrc:功能、配置與使用方法在Linux系統中,Bashrc(BourneAgainShellrunco​​mmands)是一個非常重要的配置文件,其中包含了系統啟動時自動運行的各種命令和設定。 Bashrc文件通常位於使用者的家目錄下,是一個隱藏文件,它的作用是為使用者自訂設定Bashshell的環境。一、Bashrc的功能設定環境

win11系統如何配置工作小組 win11系統如何配置工作小組 Feb 22, 2024 pm 09:50 PM

Win11系統如何設定工作群組工作群組是一種在區域網路中連接多台電腦的方式,它允許電腦之間共用檔案、印表機和其他資源。在Win11系統中,設定工作群組非常簡單,只需依照下列步驟操作即可。步驟1:開啟「設定」應用程式首先,點擊Win11系統的「開始」按鈕,然後在彈出的選單中選擇「設定」應用程式。你也可以使用快捷鍵“Win+I”開啟“設定”。步驟2:選擇「系統」在「設定」應用程式中,你會看到多個選項。請點選「系統」選項,進入系統設定頁面。步驟3:選擇「關於」在「系統」設定頁面中,你會看到多個子選項。請點

Linux系統中如何設定和安裝FTPS Linux系統中如何設定和安裝FTPS Mar 20, 2024 pm 02:03 PM

標題:Linux系統中如何配置和安裝FTPS,需要具體程式碼範例在Linux系統中,FTPS是一種安全的檔案傳輸協議,與FTP相比,FTPS透過TLS/SSL協議對傳輸的資料進行加密,提高了資料傳輸的安全性。在本文中,將介紹如何在Linux系統中設定和安裝FTPS,並提供特定的程式碼範例。步驟一:安裝vsftpd開啟終端,輸入以下指令安裝vsftpd:sudo

CentOS7系統安裝與設定 DRBD?實現高可用性和資料冗餘教程! CentOS7系統安裝與設定 DRBD?實現高可用性和資料冗餘教程! Feb 22, 2024 pm 02:13 PM

DRBD(DistributedReplicatedBlockDevice)是一種用於實現資料冗餘和高可用性的開源解決方案。以下是在CentOS7系統上安裝和設定DRBD的教學:安裝DRBD:開啟終端機並以管理員身分登入CentOS7系統。執行以下命令以安裝DRBD軟體包:sudoyuminstalldrbd配置DRBD:編輯DRBD設定檔(通常位於/etc/drbd.d目錄下),配置DRBD資源的設定。例如,可以定義主節點和備份節點的IP位址、連接埠和設備等。確保主節點和備份節點之間可以透過網

MyBatis Generator配置參數解讀及最佳實踐 MyBatis Generator配置參數解讀及最佳實踐 Feb 23, 2024 am 09:51 AM

MyBatisGenerator是MyBatis官方提供的程式碼產生工具,可以幫助開發人員快速產生符合資料庫表結構的JavaBean、Mapper介面以及XML映射檔。在使用MyBatisGenerator進行程式碼產生的過程中,配置參數的設定是至關重要的。本文將從配置參數的角度出發,深入探討MyBatisGenerator的

win11電腦配置在哪裡看? win11電腦設定資訊怎麼找方法 win11電腦配置在哪裡看? win11電腦設定資訊怎麼找方法 Mar 06, 2024 am 10:10 AM

我們在使用win11系統的時候有時候會需要查看自己的電腦配置,但是也有不少的用戶們在詢問win11電腦配置在哪裡看?其實方法很簡單的,使用者可以直接的開啟設定下的系統訊息,然後就能查看電腦設定資訊。以下就讓本站來為使用者來仔細的介紹一下win11電腦設定資訊如何查找方法吧。 win11電腦設定資訊如何找出方法方法一:1、點選開始,開啟電腦設定。 3、在此頁面即可查看電腦設定資訊。 2.在指令提示字元視窗中,輸入systeminfo回車,即可查看電腦設定。

See all articles