设置我们的春季启动项目我们在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