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