无法在PCF中使用SqlServer的Spring Cloud Connectors设置连接属性。

问题描述 投票:0回答:1

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

但我试了下面两段代码,似乎connectionConfig没有工作。

代码1 参考 Spring Cloud Spring服务连接器指南

@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);
    }
}

代码2:按照这里的建议。Spring Cloud Connectors问题

    @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... [最小Idle=20,最大PoolSize=100] 但ConnectionConfig却被忽略了,我不知道发生了什么事,还是我的代码有什么问题。

java sql-server spring-boot cloudfoundry spring-cloud-connectors
1个回答
1
投票

你使用的是HikariCP连接池库,我认为你想做的事情不可能用HikariCP和Spring Cloud Connectors来实现。

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

当使用这种配置时,连接器将尝试调用一个名为 "setter "的方法。setConnectionProperties 在检测到的 DataSource 实施。HikariDataSource 没有 setConnectionProperties 方法,就像其他支持的连接池库一样,所以这个配置不会有任何影响。同样的情况也发生在 Map-的配置选项,因为 HikariDataSource 并没有暴露任何其他允许设置此类属性的方法。

为了让它工作,你需要切换到其他的方法。支持的连接池库.

请注意,Spring Cloud Connectors 处于维护模式. 请考虑改用Java CFEnv。Java CFEnv在以下方面更加灵活。允许你直接使用JDBC URL。 (根据需要进行修改)或允许用Spring Boot属性覆盖连接细节。

© www.soinside.com 2019 - 2024. All rights reserved.