如何从 Spring Boot App 连接到运行在不同主机上的多个 Google spanner DB

问题描述 投票:0回答:2

您好,我正在尝试将我的 spring boot 应用程序连接到多个 google cloud spanner 数据库。我可以通过在 application.yml 文件中输入来连接单一数据库。我的要求是在同一个应用程序中连接两个扳手数据库。请帮助我。

spring-boot spring-data-jpa google-cloud-spanner
2个回答
0
投票

方法很长。 com.google.cloud:spring-cloud-gcp-starter-data-spanner lib 使用 application.properties 自动配置

为避免这种情况, A。你使用 spring-cloud-gcp-data-spanner b.您必须手动定义 spannerTemplate bean

这是一个快速代码片段

  @Bean
public com.google.auth.Credentials getCredentials() {

    try {
        return new DefaultCredentialsProvider(Credentials::new).getCredentials();
    } catch (IOException ex) {
        throw new RuntimeException(ex);
    }
}

@Bean
public SpannerOptions spannerOptions() {
    return SpannerOptions.newBuilder()
            .setProjectId("sab-dev-anciq-ml-gol-8565")
            .setSessionPoolOption(SessionPoolOptions.newBuilder().setMaxSessions(10).build())
            .setCredentials(getCredentials())
            .build();
}

@Bean
public Spanner spanner(SpannerOptions spannerOptions) {
    return spannerOptions.getService();
}

@Bean
public DatabaseId databaseId() {
    return DatabaseId.of("your_gcp_project_id",
            "instance_name",
            "db_name");
}

@Bean
public DatabaseClient spannerDatabaseClient(Spanner spanner, DatabaseId databaseId) {
    return spanner.getDatabaseClient(databaseId);
}


@Bean
public SpannerMappingContext spannerMappingContext(Gson gson) {
    return new SpannerMappingContext(gson);
}

@Bean
public SpannerEntityProcessor spannerConverter(SpannerMappingContext mappingContext) {
    return new ConverterAwareMappingSpannerEntityProcessor(mappingContext);
}

@Bean
public SpannerSchemaUtils spannerSchemaUtils(
        SpannerMappingContext spannerMappingContext, SpannerEntityProcessor spannerEntityProcessor) {
    return new SpannerSchemaUtils(spannerMappingContext, spannerEntityProcessor, true);
}

@Bean
public SpannerMutationFactory spannerMutationFactory(
        SpannerEntityProcessor spannerEntityProcessor,
        SpannerMappingContext spannerMappingContext,
        SpannerSchemaUtils spannerSchemaUtils) {
    return new SpannerMutationFactoryImpl(
            spannerEntityProcessor, spannerMappingContext, spannerSchemaUtils);
}

@Bean("hostSpannerTemplate")
public SpannerTemplate spannerTemplateForHostProject(
        DatabaseClient databaseClient,
        SpannerMappingContext mappingContext,
        SpannerEntityProcessor spannerEntityProcessor,
        SpannerMutationFactory spannerMutationFactory,
        SpannerSchemaUtils spannerSchemaUtils) {
    return new SpannerTemplate(
            () -> databaseClient,
            mappingContext,
            spannerEntityProcessor,
            spannerMutationFactory,
            spannerSchemaUtils);
}

您现在可以使用 spannerTemplateForHostProject 作为 bean 来执行与宿主项目相关的 curd 操作

与使用限定符类似,您现在可以定义另一个使用 databaseClient2 在参数中使用限定符的 spannerTemplate


0
投票

我有同样的问题并且能够找到解决方案:

文档

通过为

DatabaseIdProvider
创建自定义 bean,您可以将 projectId、instanceId 和数据库设置为您想要的任何值。确认也正在执行
SpannerRepository
实施。

这里是一个示例,说明如何创建自己的实现(如何为其提供 projectId、instanceId 和 databaseName 名称由您决定):

@Bean
public DatabaseIdProvider databaseIdProvider() {
    return () -> DatabaseId.of("projectId", "instanceId", "databaseName");
}

DatabaseIdProvider
接口扩展了
Supplier<DatabaseId>
DatabaseId
有一个方法 (
of
) 创建新的
DatabaseId
您需要连接到不同的数据库/实例。

举个例子(可能是一个糟糕的实现,但它是我快速启动和运行的):我在一个类中有这个 bean,我可以调用它并设置 projectId、instanceId 和 databaseName。这允许我在需要时更改我指向的数据库(从调用存储库的控制器调用等)。

希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.