[英]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.