使用Spring Cloud Connector配置时如何设置Tomcat JDBC Pool的属性?

时间:2019-02-28 14:18:39

标签: spring spring-boot spring-cloud connection-pooling spring-jdbc

我想用自定义参数值配置Tomcat JDBC Pool的属性。该池由spring-cloud(Spring Cloud Connector)环境(Cloud Foundry)引导,并连接到PostgreSQL数据库。特别是,我想为给定池设置minIdlemaxIdleinitialSize属性。

在“春季香草”环境(非云)中,可以使用轻松设置属性

  • 具有环境属性的application.properties / .yaml文件,
  • @ConfigurationProperties注释。

但是,这种方法无法转移到我的Cloud环境中,在该环境中,URL(和其他参数)是从环境变量VCAP_SERVICES(通过ServiceInfo实例)中注入的。我不想重新实现Spring Cloud已经对其连接器进行的逻辑。

经过一些搜索,我还偶然发现了一些教程/指南,建议使用PoolConfig对象(例如http://cloud.spring.io/spring-cloud-connectors/spring-cloud-spring-service-connector.html#_relational_database_db2_mysql_oracle_postgresql_sql_server)。但是,这种方式不能设置我需要的属性,而只能设置以下三个:

  • minPoolSize
  • maxPoolSize
  • maxWaitTime

请注意,我不想设置与连接相关的属性(例如charset),但是这些属性与池本身关联。

从本质上讲,我想进行与https://www.baeldung.com/spring-boot-tomcat-connection-pool类似的配置(使用spring.datasource.tomcat.*属性)。这种方法的问题在于,如果数据源是由Spring Cloud创建的,则不考虑属性。文章https://dzone.com/articles/binding-data-services-spring的“使用CloudFactory创建数据源”部分声称,以下代码段使得该文本“可以通过spring.datasource。*属性使用application.properties进行调整”:

@Bean
@ConfigurationProperties(DataSourceProperties.PREFIX)
public DataSource dataSource() {
  return cloud().getSingletonServiceConnector(DataSource.class, null);
}

但是,我自己的本地测试(使用spring-cloud:Greenwich.RELEASEspring-boot-starter-parent:2.1.3.RELEASE)表明,这些属性值只是被忽略了。

我找到了解决问题的丑陋方法,但我认为这不合适:

  • 让spring-cloud创建DataSource,它不是直接合并的DataSource,
  • 检查引用是否为DelegatingDataSource的后代,
  • 解析委托,然后是池本身
  • 直接在池本身上以编程方式更改属性。

我不认为这是正确的方法,因为我正在使用内部知识(关于数据源的分层)。此外,该方法不适用于属性initialSize,只有在创建池时才会考虑使用该属性。

0 个答案:

没有答案