您好,我正在尝试将我的 spring boot 应用程序连接到多个 google cloud spanner 数据库。我可以通过在 application.yml 文件中输入来连接单一数据库。我的要求是在同一个应用程序中连接两个扳手数据库。请帮助我。
方法很长。 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
我有同样的问题并且能够找到解决方案:
通过为
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。这允许我在需要时更改我指向的数据库(从调用存储库的控制器调用等)。
希望这有帮助!