簡體   English   中英

如何在spring中使用多個數據庫?

[英]How to use multiple databases with spring?

我需要創建網絡應用程序(使用 spring+mysql),它應該有點像“MySQL Workbench online” 在我的應用程序中,用戶將能夠創建自己的數據庫。 我是這樣做的:

用戶按下(例如按鈕)“創建新數據庫”,然后我創建一個 file.sql 並將以下代碼寫入其中:

創建架構'db_name';

如果用戶選擇選項“創建表”,我將再次打開此文件,並向其寫入正確的代碼

畢竟,當用戶最終完成他的數據庫時,當我擁有需要在我的 java 代碼中執行的所有 SQL 代碼時,我有 file.sql ......好吧,事情開始變得復雜,這是我的問題:

這是我在 application.properties 中的數據源:

spring.datasource.url=jdbc:mysql://localhost:3306/
spring.datasource.username=root
spring.datasource.password=1234

如果你看我沒有指定數據庫,我只選擇我只連接到服務器而不是特定數據庫的端口。 如果我沒有指定單個特定的數據庫,我可以對數據庫進行一些操作嗎? 在此之前,我有這樣的配置:

spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase
spring.datasource.username=root
spring.datasource.password=1234

一切正常,例如:我的選擇看起來像這樣:

從表1中選擇*;

我可以將數據源從 localhost:3306/mydatabase 更改為:localhost:3306/ 並執行該選擇嗎?

從 mydatabase.table1 中選擇 *;

如果可以,我還需要配置什么? 我總是有錯誤“沒有選擇數據庫”。

(我只需要連接到服務器而不是特定數據庫,因為我想在 java 代碼中執行 sql 代碼“創建模式”)

Spring Boot 簡化了數據源的配置。

默認情況下,Spring Boot 將使用以 spring.datasource.* 為前綴的配置屬性實例化其默認數據源:

spring.datasource.jdbcUrl = [url]
spring.datasource.username = [username]
spring.datasource.password = [password]

我們現在想繼續使用相同的方式來配置第二個數據源,但具有不同的屬性命名空間:

spring.second-datasource.jdbcUrl = [url]
spring.second-datasource.username = [username]
spring.second-datasource.password = [password]

因為我們希望 Spring Boot 自動配置選擇這些不同的屬性(並實際實例化兩個不同的數據源),所以我們將定義 2 個類似於前幾節中的配置類:

@Configuration
@PropertySource({"classpath:persistence-multiple-db-boot.properties"})
@EnableJpaRepositories(
  basePackages = "com.myProj.multipledb.dao.user",
  entityManagerFactoryRef = "userEntityManager",
  transactionManagerRef = "userTransactionManager")
public class PersistenceUserAutoConfiguration {

    @Primary
    @Bean
    @ConfigurationProperties(prefix="spring.datasource")
    public DataSource userDataSource() {
        return DataSourceBuilder.create().build();
    }
    // userEntityManager bean 

    // userTransactionManager bean
}

然后這個

@Configuration
@PropertySource({"classpath:persistence-multiple-db-boot.properties"})
@EnableJpaRepositories(
  basePackages = "com.myProj.multipledb.dao.product", 
  entityManagerFactoryRef = "productEntityManager", 
  transactionManagerRef = "productTransactionManager")
public class PersistenceProductAutoConfiguration {

    @Bean
    @ConfigurationProperties(prefix="spring.second-datasource")
    public DataSource productDataSource() {
        return DataSourceBuilder.create().build();
    }

    // productEntityManager bean 

    // productTransactionManager bean
}

我們已經根據引導自動配置約定在persistence-multiple-db-boot.properties 中定義了數據源屬性。

有趣的部分是使用@ConfigurationProperties 注釋數據源 bean 創建方法。 我們只需要指定相應的配置前綴。 在這個方法中,我們使用了一個 DataSourceBuilder,Spring Boot 會自動處理剩下的事情。 但是如何將配置的屬性實際注入到 DataSource 配置中呢?

在 DataSourceBuilder 上調用 build() 方法時,它將調用其私有 bind() 方法:

public T build() {
    Class<? extends DataSource> type = getType();
    DataSource result = BeanUtils.instantiateClass(type);
    maybeGetDriverClassName();
    bind(result);
    return (T) result;
}

這個私有方法執行了許多自動配置魔法,將解析的配置綁定到實際的 DataSource 實例:

private void bind(DataSource result) {
    ConfigurationPropertySource source = new MapConfigurationPropertySource(this.properties);
    ConfigurationPropertyNameAliases aliases = new ConfigurationPropertyNameAliases();
    aliases.addAliases("url", "jdbc-url");
    aliases.addAliases("username", "user");
    Binder binder = new Binder(source.withAliases(aliases));
    binder.bind(ConfigurationPropertyName.EMPTY, Bindable.ofInstance(result));

雖然我們不必自己接觸任何這些代碼,但了解 Spring Boot 自動配置背后發生的事情仍然很有用。

除此之外,事務管理器和實體管理器 bean 配置與標准 Spring 應用程序相同。

請參考以下鏈接作為示例: https : //medium.com/@joeclever/using-multiple-datasources-with-spring-boot-and-spring-data-6430b00c02e7

微服務架構可以解決您的問題。 使用 Spring 更容易創建它。

簡而言之,您將為您的服務創建一個數據庫(稱為gateway )和其他數據庫。 所有請求都通過網關到達其他數據庫。

閱讀這篇文章了解更多信息! ⬇️

https://spring.io/blog/2015/07/14/microservices-with-spring

此外,如果您搜索,還有更多指南。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM