到现在为止,我已经在解决我的问题很长时间了,我找不到合适的解决方案。
我需要顺序访问不同的数据库。我试图更改到数据库的链接,正如你在下面的代码中看到的那样。
public static void changeDB(String dbname) throws IOException{
File f = new File("application.properties");
if (f.exists()) {
f.delete();
}
f.createNewFile();
System.out.println("gelöscht");
FileWriter fw = new FileWriter("application.properties");
BufferedWriter bw = new BufferedWriter(fw);
String dbchanger = "spring.datasource.url = jdbc:mysql://localhost:3306/kamis" + dbname;
bw.write("server.port = 8000");
bw.write("\n");
bw.write(dbchanger);
bw.write("\n");
bw.write("spring.datasource.username=root");
bw.write("\n");
bw.write("spring.datasource.password=");
bw.write("\n");
bw.write("spring.datasource.driver-class-name = com.mysql.jdbc.Driver");
bw.write("\n");
bw.write("spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect");
bw.write("\n");
bw.write("spring.jpa.hibernate.ddl-auto=update");
bw.write("\n");
bw.write("spring.devtools.livereload.enabled=true");
bw.close();
System.out.println("neu erstellt");
}
到目前为止,这在某种程度上是可行的。问题是应用程序需要重新加载才能从我的应用程序中读取更改。属性来连接到另一个数据库,这对我来说并不是一个真正的解决方案,因为应用程序会重新启动。它还必须是动态可变的,因为我正在处理30多个数据库。
也许你们可以帮我找出如何重新加载它,或者给我一个更合适的解决方案来解决我的问题。
提前谢谢。凯
似乎您可以实现多租户方法,几个月前我在一篇博文中谈到的主题:使用Spring Boot、JPA、Hibernate和Postgres的多租户应用程序
为多租户支持配置持久层的步骤包括:
应用yml公司
...
multitenancy:
dvdrental:
dataSources:
-
tenantId: TENANT_01
url: jdbc:postgresql://172.16.69.133:5432/db_dvdrental
username: user_dvdrental
password: changeit
driverClassName: org.postgresql.Driver
-
tenantId: TENANT_02
url: jdbc:postgresql://172.16.69.133:5532/db_dvdrental
username: user_dvdrental
password: changeit
driverClassName: org.postgresql.Driver
...
我使用了一个属性文件来存储租户数据,但可以将租户信息存储在一种主数据库中。
MultiTenantJpaConfiguration.java
...
@Configuration
@EnableConfigurationProperties({ MultiTenantDvdRentalProperties.class, JpaProperties.class })
@ImportResource(locations = { "classpath:applicationContent.xml" })
@EnableTransactionManagement
public class MultiTenantJpaConfiguration {
@Autowired
private JpaProperties jpaProperties;
@Autowired
private MultiTenantDvdRentalProperties multiTenantDvdRentalProperties;
...
}
MultiTenantDvdRentalProperties.java
...
@Configuration
@ConfigurationProperties(prefix = "multitenancy.dvdrental")
public class MultiTenantDvdRentalProperties {
private List<DataSourceProperties> dataSourcesProps;
// Getters and Setters
public static class DataSourceProperties extends org.springframework.boot.autoconfigure.jdbc.DataSourceProperties {
private String tenantId;
// Getters and Setters
}
}
MultiTenantJpaConfiguration.java
...
public class MultiTenantJpaConfiguration {
...
@Bean(name = "dataSourcesDvdRental" )
public Map<String, DataSource> dataSourcesDvdRental() {
...
}
...
}
MultiTenantJpaConfiguration.java
...
public class MultiTenantJpaConfiguration {
...
@Bean
public MultiTenantConnectionProvider multiTenantConnectionProvider() {
...
}
@Bean
public CurrentTenantIdentifierResolver currentTenantIdentifierResolver() {
...
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(MultiTenantConnectionProvider multiTenantConnectionProvider,
CurrentTenantIdentifierResolver currentTenantIdentifierResolver) {
...
}
...
}
MultiTenantJpaConfiguration.java
...
public class MultiTenantJpaConfiguration {
...
@Bean
public EntityManagerFactory entityManagerFactory(LocalContainerEntityManagerFactoryBean entityManagerFactoryBean) {
...
}
@Bean
public PlatformTransactionManager txManager(EntityManagerFactory entityManagerFactory) {
...
}
...
}
应用Content.xml
...
<jpa:repositories base-package="com.asimio.dvdrental.dao" transaction-manager-ref="txManager" />
<tx:annotation-driven transaction-manager="txManager" proxy-target-class="true" />
...
阿克托多。Java语言
public interface ActorDao extends JpaRepository<Actor, Integer> {
}
根据您的需要,可以这样做:
...
@Autowired
private ActorDao actorDao;
...
DvdRentalTenantContext.setTenantId("TENANT_01");
this.actorDao.findOne(...);
...
// Or
DvdRentalTenantContext.setTenantId("TENANT_02");
this.actorDao.save(...);
...
设置tenantId可以在将要执行JPA操作等的servlet过滤器/Spring MVC拦截器/线程中完成。
同样,可以在以下位置找到详细说明和源代码:使用Spring Boot、JPA、Hibernate和Postgres的多租户应用程序
您可以在Spring配置中定义多个DataSource对象并使用所需的对象。
将两个数据源标记为@Bean。还需要定义两个EntityManager(每个基于自己的数据源)。
阅读示例了解更多信息
更新:对于这种情况,我将实现代理数据源以保持逻辑。其思想是实现数据源接口,该接口在内部可以有数据源的映射。(关键是JDBC URL用户名)
最初地图是空的。在第一次调用时,我们检查地图中是否有提供用户的实例。如果没有,我们会动态创建一个新的DataSource实例并放置在地图中。所有ProxyDataSource方法只是获取(或创建)委托用户特定的DataSource实例并调用用户实例的相同方法。
您声明@Bean DataSource whcih返回代理数据源wch,它在内部处理逻辑。
您可以使用我所做的以下配置在Spring启动中使用多个数据库。pplication.properties:-
server.port=6060
spring.ds_post.url =jdbc:postgresql://localhost:5432/kode12
spring.ds_post.username =postgres
spring.ds_post.password =root
spring.ds_post.driverClassName=org.postgresql.Driver
spring.ds_mysql.url = jdbc:mysql://localhost:3306/kode12
spring.ds_mysql.username = root
spring.ds_mysql.password = root
spring.ds_mysql.driverClassName=com.mysql.jdbc.Driver
多路B配置。Java语言
@Configuration
public class MultipleDBConfig {
@Bean(name = "mysqlDb")
@ConfigurationProperties(prefix = "spring.ds_mysql")
public DataSource mysqlDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "mysqlJdbcTemplate")
public JdbcTemplate jdbcTemplate(@Qualifier("mysqlDb") DataSource dsMySQL) {
return new JdbcTemplate(dsMySQL);
}
@Bean(name = "postgresDb")
@ConfigurationProperties(prefix = "spring.ds_post")
public DataSource postgresDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "postgresJdbcTemplate")
public JdbcTemplate postgresJdbcTemplate(@Qualifier("postgresDb")
DataSource dsPostgres) {
return new JdbcTemplate(dsPostgres);
}
}
这是带注释的配置类,包含用于加载PostgreSQL和MySQL配置的函数和注释。它还负责为每个模板创建一个JDBCTemplate实例。
ActiveX Data Objects (ADO) 是一项容易使用并且可扩展的将数据库访问添加到 Web 页的技术。可以使用 ADO 去编写紧凑简明的脚本以便连接到 Open Database Connectivity (ODBC) 兼容的数据库和 OLE DB 兼容的数据源。如果您是一个对数据库连接有一定了解的脚本编写人员,那么您将发现 ADO 命令语句并不复杂而且容易掌握。同样地,如果您是一
对许多Web应用程序而言,数据库都是其核心所在。数据库几乎可以用来存储你想查询和修改的任何信息,比如用户信息、产品目录或者新闻列表等。 Go没有内置的驱动支持任何的数据库,但是Go定义了database/sql接口,用户可以基于驱动接口开发相应数据库的驱动,5.1小节里面介绍Go设计的一些驱动,介绍Go是如何设计数据库驱动接口的。5.2至5.4小节介绍目前使用的比较多的一些关系型数据驱动以及如何使
程序运行的时候,数据都是在内存中的。当程序终止的时候,通常都需要将数据保存到磁盘上,无论是保存到本地磁盘,还是通过网络保存到服务器上,最终都会将数据写入磁盘文件。 而如何定义数据的存储格式就是一个大问题。如果我们自己来定义存储格式,比如保存一个班级所有学生的成绩单: 名字 成绩 Michael 99 Bob 85 Bart 59 Lisa 87 你可以用一个文本文件保存,一行保存一个学生,用,隔开
程序运行的时候,数据都是在内存中的。当程序终止的时候,通常都需要将数据保存到磁盘上,无论是保存到本地磁盘,还是通过网络保存到服务器上,最终都会将数据写入磁盘文件。 而如何定义数据的存储格式就是一个大问题。如果我们自己来定义存储格式,比如保存一个班级所有学生的成绩单: 名字 成绩 Michael 99 Bob 85 Bart 59 Lisa 87 你可以用一个文本文件保存,一行保存一个学生,用,隔开
我目前有一个类似以下的数据库结构。如果无法在Firebase实时数据库安全规则中循环,我如何基于用户对多个组的访问来保护数据?要遵循的例子... 数据库结构: 我如何在上指定安全规则,以基于中指定的任何组与当前用户的
主要内容:创建动作:,创建页面:,创建视图:,配置文件:本章将教如何使用Struts 2的简单的步骤来访问数据库。 Struts是一个MVC框架,而不是一个数据库框架,但它提供了极好的支持JPA/ Hibernate集成。我们将看看在的Hibernate集成在后面的章节,但在这一章中,我们将使用纯JDBC来访问数据库。 在这一章中的第一个步骤是设置我们的数据库。我作为我的数据库在这个例子中使用MySQL。在机器上安装MySQL,我创建了一个新的数据库称