【问题标题】:Cannot set connectionProperties with Spring Cloud Connectors in PCF with SqlServer无法使用 SqlServer 在 PCF 中使用 Spring Cloud 连接器设置 connectionProperties
【发布时间】:2020-09-13 06:33:21
【问题描述】:

我在部署到PCF的项目中设置我的DataSource,并且sqlserver存在性能问题,所以我想添加属性:sendStringParametersAsUnicode=false来解决这个问题,就像本地的jdbcUrl设置:url: jdbc:sqlserver://localhost:1433;databaseName=localdatasource;sendStringParametersAsUnicode=false

但我尝试了以下两个代码,似乎connectionConfig不起作用。

代码1参考Spring Cloud Spring Service Connector guide

@Configuration
@Profile({"dev", "sit", "uat", "prod"})
@Slf4j
public class CloudConfig extends  AbstractCloudConfig {
    @Value("${datasourceinfo.min-idle}")
    private int dataSourceMinPoolSize = 20;
    @Value("${datasourceinfo.max-active}")
    private int dataSourceMaxPoolSize = 100;
    @Value("${datasourceinfo.max-wait}")
    private int dataSourceMaxWaitTime = -1;

    @Value("${datasourceinfo.azureDatabase}")
    private String azureDatabase;

    @Bean
    @Primary
    public DataSource dataSource() {
        PooledServiceConnectorConfig.PoolConfig poolConfig = new PooledServiceConnectorConfig.PoolConfig(dataSourceMinPoolSize, dataSourceMaxPoolSize, dataSourceMaxWaitTime);
        DataSourceConfig.ConnectionConfig connConfig = new DataSourceConfig.ConnectionConfig("sendStringParametersAsUnicode=false");
        DataSourceConfig dbConfig = new DataSourceConfig(poolConfig, connConfig);
        log.info("======================init dataSource connProperties {}",dbConfig);
        return connectionFactory().dataSource(azureDatabase, dbConfig);
    }
}

Code2:遵循此处的建议:Spring Cloud Connectors issue

    @Primary
    public DataSource dataSource() {
        PooledServiceConnectorConfig.PoolConfig poolConfig = new PooledServiceConnectorConfig.PoolConfig(dataSourceMinPoolSize, dataSourceMaxPoolSize, dataSourceMaxWaitTime);
        Map<String, Object> connProperties = new HashMap<>();
        connProperties.put("connectionProperties","sendStringParametersAsUnicode=false");
        DataSourceConfig dbConfig = new DataSourceConfig(poolConfig,null,null,connProperties);
        log.info("======================init dataSource connProperties {}",dbConfig);
        return connectionFactory().dataSource(azureDatabase, dbConfig);
    }

日志如下:

2020-05-26T20:13:48.724+08:00 [APP/PROC/WEB/0] [OUT] DEBUG . [26-05-2020 20:13:48.724+0800] [main] [springAppName_IS_UNDEFINED,,,] [c.z.h.HikariConfig] HikariPool-1 - configuration:
2020-05-26T20:13:48.727+08:00 [APP/PROC/WEB/0] [OUT] DEBUG . [26-05-2020 20:13:48.727+0800] [main] [springAppName_IS_UNDEFINED,,,] [c.z.h.HikariConfig] connectionTestQuery............."SELECT 1"
2020-05-26T20:13:48.727+08:00 [APP/PROC/WEB/0] [OUT] DEBUG . [26-05-2020 20:13:48.727+0800] [main] [springAppName_IS_UNDEFINED,,,] [c.z.h.HikariConfig] connectionTimeout...............30000
2020-05-26T20:13:48.728+08:00 [APP/PROC/WEB/0] [OUT] DEBUG . [26-05-2020 20:13:48.728+0800] [main] [springAppName_IS_UNDEFINED,,,] [c.z.h.HikariConfig] driverClassName................."com.microsoft.sqlserver.jdbc.SQLServerDriver"
2020-05-26T20:13:48.729+08:00 [APP/PROC/WEB/0] [OUT] DEBUG . [26-05-2020 20:13:48.729+0800] [main] [springAppName_IS_UNDEFINED,,,] [c.z.h.HikariConfig] jdbc4ConnectionTest.............false
2020-05-26T20:13:48.729+08:00 [APP/PROC/WEB/0] [OUT] DEBUG . [26-05-2020 20:13:48.729+0800] [main] [springAppName_IS_UNDEFINED,,,] [c.z.h.HikariConfig] jdbcUrl.........................**jdbc:sqlserver://myIp:1433;database=devDb;user=u4a1780c36;password=<masked>;Encrypt=true;TrustServerCertificate=false;HostNameInCertificate=*.database.windows.net;loginTimeout=30;**
2020-05-26T20:13:48.729+08:00 [APP/PROC/WEB/0] [OUT] DEBUG . [26-05-2020 20:13:48.729+0800] [main] [springAppName_IS_UNDEFINED,,,] [c.z.h.HikariConfig] leakDetectionThreshold..........0
2020-05-26T20:13:48.730+08:00 [APP/PROC/WEB/0] [OUT] DEBUG . [26-05-2020 20:13:48.729+0800] [main] [springAppName_IS_UNDEFINED,,,] [c.z.h.HikariConfig] maxLifetime.....................1800000
2020-05-26T20:13:48.730+08:00 [APP/PROC/WEB/0] [OUT] DEBUG . [26-05-2020 20:13:48.730+0800] [main] [springAppName_IS_UNDEFINED,,,] [c.z.h.HikariConfig] maximumPoolSize.................100
2020-05-26T20:13:48.730+08:00 [APP/PROC/WEB/0] [OUT] DEBUG . [26-05-2020 20:13:48.730+0800] [main] [springAppName_IS_UNDEFINED,,,] [c.z.h.HikariConfig] metricRegistry..................none
2020-05-26T20:13:48.730+08:00 [APP/PROC/WEB/0] [OUT] DEBUG . [26-05-2020 20:13:48.730+0800] [main] [springAppName_IS_UNDEFINED,,,] [c.z.h.HikariConfig] metricsTrackerFactory...........com.zaxxer.hikari.metrics.micrometer.MicrometerMetricsTrackerFactory@75add13c
2020-05-26T20:13:48.730+08:00 [APP/PROC/WEB/0] [OUT] DEBUG . [26-05-2020 20:13:48.730+0800] [main] [springAppName_IS_UNDEFINED,,,] [c.z.h.HikariConfig] minimumIdle.....................20
2020-05-26T20:13:48.730+08:00 [APP/PROC/WEB/0] [OUT] DEBUG . [26-05-2020 20:13:48.730+0800] [main] [springAppName_IS_UNDEFINED,,,] [c.z.h.HikariConfig] password........................<masked>
2020-05-26T20:13:48.730+08:00 [APP/PROC/WEB/0] [OUT] DEBUG . [26-05-2020 20:13:48.730+0800] [main] [springAppName_IS_UNDEFINED,,,] [c.z.h.HikariConfig] poolName........................"HikariPool-1"

从日志中,我发现 PoolConfig [minimumIdle=20,maximumPoolSize=100] 已更新,但 ConnectionConfig 被忽略,我不知道发生了什么或有什么问题用我的代码。 谢谢。

【问题讨论】:

  • 您从哪里获得连接 URL?它来自绑定服务吗?如果是这样,那是由经纪人创建的,还是用户提供的服务?还是来自其他地方?如果可能,最简单的选项是编辑 jdbc URL 并附加选项。那些应该通过。
  • 连接 URL 是从 PCF 上的绑定服务获取的,所以我无法直接编辑 jdbc URL。
  • @Angle.Bracket 你能帮忙吗?

标签: java sql-server spring-boot cloud-foundry spring-cloud-connectors


【解决方案1】:

您正在使用 HikariCP 连接池库,我认为您尝试使用 HikariCP 和 Spring Cloud 连接器是不可能的。

    DataSourceConfig.ConnectionConfig connConfig = new DataSourceConfig.ConnectionConfig("sendStringParametersAsUnicode=false");
    DataSourceConfig dbConfig = new DataSourceConfig(poolConfig, connConfig);

使用此配置时,连接器将尝试在检测到的DataSource 实现上调用名为setConnectionProperties 的setter 方法。 HikariDataSource 没有像其他支持的连接池库那样的 setConnectionProperties 方法,因此此配置将无效。基于Map 的配置选项也是如此,因为HikariDataSource 没有公开任何其他允许设置此类属性的方法。

为了让它工作,您需要切换到另一个supported connection pooling libraries

请注意 Spring Cloud 连接器 is in maintenance mode。请考虑改用 Java CFEnv。 Java CFEnv 在allowing you to use the JDBC URL directly(根据需要进行修改)或允许使用 Spring Boot 属性覆盖连接细节方面更加灵活。

【讨论】:

  • 我明白了,谢谢 Scott,我刚刚通过重建 jdbcUrl 解决了这个问题。
猜你喜欢
  • 2017-06-13
  • 2019-07-19
  • 1970-01-01
  • 1970-01-01
  • 2018-12-15
  • 2021-05-09
  • 2014-12-04
  • 2016-07-05
  • 2019-06-12
相关资源
最近更新 更多