简体   繁体   中英

How to Connect to Multiple Google spanner DB running on different host from Spring Boot App

Hi I am trying to connect my spring boot application to multiple google cloud spanner DB. I am able to connect with Single database by making entry in application.yml file. My requirement is tonnect with two spanner database in same application. Please help me.

The approach is a lengthy one. The com.google.cloud:spring-cloud-gcp-starter-data-spanner lib autoconfigures using application.properties

To avoid this, a. you use spring-cloud-gcp-data-spanner b. You would have to define the spannerTemplate bean manually

Here is a quick code snippet

  @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);
}

You can now use spannerTemplateForHostProject as a bean to do your curd ops related to host project

Similiarly using Qualifiers you can now define another spannerTemplate that uses databaseClient2 using qualifier in argument

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM