Java 如何在spring中使用多个数据库?

Java 如何在spring中使用多个数据库?,java,mysql,spring,hibernate,multiple-databases,Java,Mysql,Spring,Hibernate,Multiple Databases,我需要创建web应用程序(使用spring+mysql),它应该有点像“mysql在线工作台”。 在我的应用程序中,用户将能够创建自己的数据库。我是这样做的: 用户按下(例如按钮)“创建新数据库”,然后我创建一个file.sql并向其中写入以下代码: 创建模式“db_name” 如果用户选择“创建表”选项,我将再次打开此文件,并向其写入正确的代码 在所有这些之后,当用户最终完成他的数据库时,我有file.sql,当我有所有需要在java代码中执行的sql代码时。。。事情开始变得复杂起来,我的问题

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

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

创建模式“db_name”

如果用户选择“创建表”选项,我将再次打开此文件,并向其写入正确的代码

在所有这些之后,当用户最终完成他的数据库时,我有file.sql,当我有所有需要在java代码中执行的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代码“创建模式”)

amicroservices体系结构解决您的问题。使用Spring更容易创建它

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

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


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

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引导自动配置能够获取这些不同的属性(并实际实例化两个不同的数据源),所以我们将定义两个与前面章节中的配置类类似的配置类:

@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将自动处理其余的部分。 但是,配置的属性实际上是如何注入到数据源配置中的呢

在DataSourceBuilder上调用build()方法时,它将调用其私有bind()方法:

尽管我们自己不必接触这些代码,但了解Spring Boot自动配置的引擎盖下发生了什么仍然很有用

除此之外,事务管理器和实体管理器bean配置与标准Spring应用程序相同

请参考以下链接以获取示例:

我一点儿也不明白你的意思。您发布了“2个数据库的静态配置”。在我的应用程序中,我不知道需要多少数据库。也许10,也许50,也许1000。每个用户都可以创建许多数据库。所以我想我还不能决定我需要多少数据库。我需要动态更改数据库的数量。正因为如此,我认为只连接到服务器(而不是特定的数据库)将是一个好主意,但生活是残酷的,它的想法看起来可能是不现实的。每个用户一个数据库。这是一个奇怪的案例或是一个不可持续的设计。如果您有大量非结构化数据,那么就不可能使用基于sql的数据库,比如DynamoDB或MongoDB。在上面的示例中,我使用了两个DBs。正如在给出的链接中,博客作者使用了MySQL和另一个非SQL数据库。关系型MySQL用于存储结构化数据,如配置文件数据,而非结构化数据不使用sql。
public T build() {
    Class<? extends DataSource> type = getType();
    DataSource result = BeanUtils.instantiateClass(type);
    maybeGetDriverClassName();
    bind(result);
    return (T) result;
}
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));