Я хочу настроить свойства Tomcat JDBC Pool с использованием пользовательских значений параметров.Пул загружается средой Spring Cloud Connector (Cloud Foundry) и подключается к базе данных PostgreSQL.В частности, я хочу установить свойства minIdle
, maxIdle
и initialSize
для данного пула.
В среде «весна-ваниль» (не облачной) свойства можно легко установить с помощью файлов
- application.properties / .yaml со свойствами среды,
@ConfigurationProperties
аннотация.
Однако этот подход не переносится в мою облачную среду, где 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
.
Обратите внимание, что я не хочу устанавливать свойства, связанные с подключением (например, набор символов), но свойства связаны с самим пулом.
По сути, я хотел бы выполнить настройку аналогично https://www.baeldung.com/spring-boot-tomcat-connection-pool (используя свойства spring.datasource.tomcat.*
). Проблема этого подхода заключается в том, что свойства не учитываются, если источник данных был создан Spring Cloud.https://dzone.com/articles/binding-data-services-spring, В разделе «Использование CloudFactory для создания источника данных» утверждается, что следующий фрагмент кода делает это так, что конфигурация «может быть изменена с использованием application.properties через spring.datasource. *properties ":
@Bean
@ConfigurationProperties(DataSourceProperties.PREFIX)
public DataSource dataSource() {
return cloud().getSingletonServiceConnector(DataSource.class, null);
}
Однако мой собственный локальный тест (с spring-cloud:Greenwich.RELEASE
и spring-boot-starter-parent:2.1.3.RELEASE
) показал, что эти значения свойств просто игнорируются.
Я нашел некрасивый способ решениямоя проблема, но я думаю, что она неуместна:
- Пусть Spring-Cloud создаст DataSource, который не является непосредственно DataSource в пуле,
- проверьте, что ссылка является потомком DelegatingDataSource,
- разрешить делегат, который затем является самим пулом,
- изменить свойства программно непосредственно в самом пуле.
Я не верю, что этоправильный путь, поскольку я использую внутреннее знание (на уровне источников данных).Кроме того, этот подход не работает для свойства initialSize
, которое учитывается только при создании пула.