При создании нашего проекта 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?