【问题标题】:How to use multiple databases with spring?spring 如何使用多个数据库?
【发布时间】:2020-04-09 00:38:42
【问题描述】:

我需要创建 web-app(使用 spring+mysql),它应该有点像 “MySQL Workbench online”。 在我的应用程序中,用户将能够创建自己的数据库。我是这样做的:

用户按下(例如按钮)“创建新数据库”,然后我创建一个 file.sql 并将以下代码写入其中:

CREATE SCHEMA '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

一切正常,例如:我的选择看起来像这样:

从table1中选择*;

我可以将数据源从 localhost:3306/mydatabase 更改为:localhost:3306/ 并执行该选择吗?

从 mydatabase.table1 中选择 *;

如果可以,我还需要配置什么?我总是遇到“未选择数据库”错误。

(我只需要连接到服务器而不是特定数据库,因为我想在 java 代码中执行 sql 代码“创建模式”)

【问题讨论】:

    标签: java mysql spring hibernate multiple-databases


    【解决方案1】:

    Spring Boot 简化了数据源的配置。

    默认情况下,Spring Boot 将使用前缀为 spring.datasource.* 的配置属性实例化其默认 DataSource:

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

    我们现在想继续使用相同的方式来配置第二个 DataSource,但使用不同的属性命名空间:

    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
    }
    

    我们已经根据 Boot 自动配置约定在 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

    【讨论】:

    • 我有点不明白你的意思。您发布了“带有 2x 数据库的静态配置”。那么在我的应用程序中,我不知道我需要多少数据库。也许 10 个,也许 50 个,也许 1000 个。每个用户可以创建许多数据库。 Soo 我想我还不能决定我需要多少数据库。我需要动态更改我的数据库数量。正因为如此,我认为只连接到服务器(而不是特定数据库)是个好主意,但生活是残酷的,看起来这个想法可能不切实际。
    • 每个用户一个数据库。这是一个奇怪的案例或不可持续的设计。如果你有很多非结构化数据,你可以选择基于 no-sql 的数据库,比如 DynamoDB 或 MongoDB。在上面的方法示例中,我使用了两个数据库。如给出的链接所示,博主使用了 MySQL 和另一个非 SQL 数据库。关系型 MySQL 用于存储结构化数据,例如配置文件数据,而 no-sql 用于存储非结构化数据。
    【解决方案2】:

    微服务 架构可以解决您的问题。使用 Spring 更容易创建它。

    简而言之,您将为您的服务创建一个数据库(称为网关)和其他数据库。所有请求都通过网关到达其他数据库。

    阅读本文了解更多信息! ⬇️

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-24
      • 2013-09-21
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      • 1970-01-01
      • 2010-11-06
      • 2016-12-12
      相关资源
      最近更新 更多