目前,我正在一个springboot(2.2.4)项目中使用springdatajpa。目前我们配置了2个数据源,因为我们有2个数据库(在同一主机上),如下所述:https://springframework.guru/how-to-configure-multiple-data-sources-in-a-spring-boot-application/ 或者在这里:https://www.baeldung.com/spring-data-jpa-multiple-databases
因此,我的application.yml文件如下所示:
app:
datasource:
db-1:
url: jdbc:mariadb://db:3306/db1
username:***
password:***
....
db-2:
url: jdbc:mariadb://db:3306/db2
username:***
password:***
....
我正在使用testcontainers(https://www.testcontainers.org/)和JUnit5进行集成测试。使用一个数据源一切正常,但是使用两个数据源时会变得棘手。
下面是我的integrationtest的一些伪代码:
@SpringBootTest
@ExtendWith(TestExtension.class)
class IntegrationTest{
@Test
public void test() {
repositoryDatabase1.saveInDatabase1
}
@Test
public void secondTest() {
repositoryDatabase2.readFromDatabase2
}
}
您可能已经注意到,我已经定义了一个junit5扩展:“testextensions.class”,它是由我的integrationtest扩展的。此扩展包含管理容器的逻辑:
public class TestExtension
implements BeforeAllCallback, AfterAllCallback {
@Override
public void beforeAll(ExtensionContext context) {
MariaDBContainer container =
new MariaDBContainer("mariadb:10.4.0").withDatabaseName("db1");
container.start();
System.setProperty("app.datasource.db1.url", container.getJdbcUrl());
System.setProperty("app.datasource.db1.username", container.getUsername());
System.setProperty("app.datasource.db1.password", container.getPassword());
context
.getStore(ExtensionContext.Namespace.GLOBAL)
.put(MariaDBContainer.class.getSimpleName() , container);
}
@Override
public void afterAll(ExtensionContext context) {
context
.getStore(ExtensionContext.Namespace.GLOBAL)
.get(MariaDBContainer.class.getSimpleName(), MariaDBContainer.class)
.stop();
}
}
因此,我们启动一个mariadbcontainer,并设置系统属性(jdburl、用户名、密码),以便我们的应用程序可以与数据库通信。这个设置对于一个数据源工作得很好,但是我希望我的集成测试能够与两个不同的数据源进行通信。
我尝试在扩展中添加第二个数据源的属性,如下所示,以便它们可用,应用程序使用此属性连接到第二个数据库:
System.setProperty("app.datasource.db1.url", container.getJdbcUrl());
System.setProperty("app.datasource.db1.username", container.getUsername());
System.setProperty("app.datasource.db1.password", container.getPassword());
System.setProperty("app.datasource.db2.url", "jdbc:mariadb://db:3306/db2");
System.setProperty("app.datasource.db2.username", container.getUsername());
System.setProperty("app.datasource.db2.password", container.getPassword());
然而,这不起作用,我总是得到错误:坏凭证。我不确定是否可能在同一个容器中有不同的数据源,因为在启动db容器时只能定义单个数据库名称/架构:
MariaDBContainer container =
new MariaDBContainer("mariadb:10.4.0").withDatabaseName("db1");
我不知道如何解决这个问题。
暂无答案!
目前还没有任何答案,快来回答吧!