设置我们的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 Boot能够自动配置数据库连接,我们正在使用Spring Data 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现在在该数据源上执行请求,并且不再自动配置我的CLoud SQL数据源。
我尝试设置@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实例。我使用的是与application.yaml中使用的参数完全相同的参数。
那么我如何才能将自动配置保留到Cloud GCP以满足我的JPA需求,并为jdbc模板添加第二个数据源?
答案 0 :(得分:0)
您可以参考以下文章-> spring-data-jpa-multiple-databases或using-multiple-datasources-with-spring-boot
基本上,在定义和初始化数据源时,您可以指定将使用该特定数据源的存储库的基本软件包名称。
例如在oracle的配置类中,可以指定将使用oracle db的存储库的基本软件包,在Cloud GCP中,可以指定包含将与Cloud GCP联系的存储库的软件包。
答案 1 :(得分:0)