Spring Boot-配置第二个数据源以及GLOUD GCP PostgreSQL主数据源



设置我们的春季启动项目我们在Google Cloud GCP上托管了一个数据库。我们使用Spring Data JPA来操纵我们的数据库对象,并且效果很好。

application.yaml

spring:
  jpa:
database-platform: org.hibernate.dialect.PostgreSQL95Dialect
properties:
  hibernate:
    default_schema: {schema}
    dialect : org.hibernate.dialect.PostgreSQL95Dialect
datasource:
  username: {username}
  password: {pwd}
cloud:
  gcp:
    sql:
      database-name: {dbname}
      instance-connection-name: {connection-name}

pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-gcp-starter-sql-postgresql</artifactId>
</dependency>

使用这个春季启动可以自动配置数据库连接,我们使用弹簧数据JPA来操纵数据库对象。

此数据源仅由我们的项目使用,但是我们的公司具有我需要使用的ERP使用的Oracle数据库。我认为我会使用jdbctemplate。

所以我设置了一个数据源和链接到它的JDBCTEMPLATE:

datasourceconfiguration.java

@Bean(name = "dataSourceGenerix")
public DataSource dataSourceGenerix() {
    final DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName(generixDatasourceDriver);
    dataSource.setUrl(generixDatasourceUrl);
    dataSource.setUsername(generixDatasourceUsername);
    dataSource.setPassword(generixDatasourcePassword);
    return dataSource;
}
@Bean
public NamedParameterJdbcTemplate jdbcTemplateGenerix(@Qualifier("dataSourceGenerix") DataSource dataSourceGenerix) {
    NamedParameterJdbcTemplate jdbcTemplate = null;
    try(Connection conn = DataSourceUtils.getConnection(dataSourceGenerix)) {
        jdbcTemplate = new NamedParameterJdbcTemplate(dataSourceGenerix);
    } catch (SQLException | CannotGetJdbcConnectionException e) {
        log.error("{} {} : {}", Constantes.NO_DB_CONNECTION_GENERIX, generixDatasourceUrl, e.getMessage());
    }
    return jdbcTemplate;
}

使用该设置,我可以在此数据源上执行请求。

但是,由于我明确配置了数据源,因此JPA现在在该数据源上执行请求,并且不再自动配置我的云SQL DataSource。

我尝试设置@primary数据源并明确配置参数:

@Bean
@Primary
DataSource dataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setUrl("jdbc:postgresql://google/{dbname}?cloudSqlInstance={instancename}&socketFactory=com.google.cloud.sql.postgres.SocketFactory");
    dataSource.setUsername({username});
    dataSource.setPassword({pwd});
    return dataSource;
}

这是启动的日志:

c.g.cloud.sql.core.SslSocketFactory : Obtaining ephemeral certificate for Cloud SQL instance [{instancename}].
o.s.b.a.orm.jpa.DatabaseLookup      : Unable to determine jdbc url from datasource
org.springframework.jdbc.support.MetaDataAccessException: Could not get Connection for extracting meta-data; nested exception is org.springframework.jdbc.CannotGetJdbcConnectionException:
Caused by: java.lang.RuntimeException: Unable to retrieve information about Cloud SQL instance
Caused by: java.net.SocketTimeoutException: connect timed out

因此,似乎无法连接到Cloud SQL实例。我正在使用与应用程序中使用的完全相同的参数。yaml。

那么,如何将自动配置保持在我的JPA需求的云GCP上,并为JDBC模板添加第二个数据源?

您可以参考这些文章 -> spring-data-jpa-multiple-database或使用multiple-datasources-with-spring-boot

基本上是在定义和初始化数据源时,您可以指定将使用该特定数据源的存储库的基本软件包名称。

例如。在Oracle的配置类中,您可以指定将使用Oracle DB的存储库的基本软件包,在Cloud GCP中,您可以指定包含存储库的软件包,这些存储库将接触到Cloud GCP。

检查存储库,请查看此示例。

https://medium.com/@joeclever/using-multiple-datasources-with-spring-boot-boot-and-spring-data-6430b00c02e7

https://www.javaguides.net/2018/09/spring-boot-jpa-multiple-data-sources-sources-example.html

相关内容

  • 没有找到相关文章

最新更新