Spring boot - настройка второго источника данных вместе с основным источником данных gloud gcp postgresql - PullRequest
0 голосов
/ 24 мая 2019

При создании нашего проекта Spring Boot у нас есть база данных, размещенная в 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>

Использование этой загрузки Spring позволяет автоматически настраивать соединение с базой данных, и мы используем Spring Data JPA для управления объектами базы данных.

Этот источник данных используется только нашим проектом, но наша компания имеетБаза данных Oracle, используемая нашей ERP, которая мне нужна.Я решил использовать 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 теперь выполняет запросы к этому источнику и больше не выполняет автоконфигурирование моего источника данных CLoud SQL.

Я пыталсянастройка источника @Primary Datasource и явная настройка параметров:

@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.Я использую те же параметры, что и в файле application.yaml.

Итак, как я могу сохранить автоконфигурацию в Cloud GCP для своих нужд JPA и добавить второй источник данных для шаблона jdbc?

Ответы [ 2 ]

0 голосов
/ 25 мая 2019
0 голосов
/ 24 мая 2019

Вы можете обратиться к этим статьям -> spring-data-jpa-множественные базы данных или с использованием нескольких источников данных с пружиной загрузки

Обычно при определении и инициализации источника данных вы можете указать имя базового пакета репозиториев, которые будут использовать этот конкретный источник данных.

например. в классе конфигурации oracle вы можете указать базовый пакет репозитория, который будет использовать oracle db, а в Cloud GCP вы можете указать пакет, содержащий репозитории, которые будут связываться с Cloud GCP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...