【问题标题】:Cannot set connectionProperties with Spring Cloud Connectors in Cloud Foundry无法使用 Cloud Foundry 中的 Spring Cloud 连接器设置 connectionProperties
【发布时间】:2017-06-13 08:01:12
【问题描述】:

我正在使用 Tomcat JDBC 连接池和 MariaDB JDBC 驱动程序在 Cloud Foundry 上运行的 Spring Boot / Spring Cloud Connectors 项目中设置我的数据源,如下所示:

@Configuration
@Profile("cloud")
public class MyDataSourceConfiguration extends AbstractCloudConfig {
    @Bean
    public DataSource dataSource() {
        Map<String, Object> dataSourceProperties = new HashMap<>();
        dataSourceProperties.put("initialSize", "4"); // OK
        dataSourceProperties.put("maxActive", "4");   // OK
        dataSourceProperties.put("maxWait", "2000");  // OK
        dataSourceProperties.put("connectionProperties",      
        "useUnicode=yes;characterEncoding=utf8;"); // ignored
        DataSourceConfig conf = new DataSourceConfig(dataSourceProperties);
        return connectionFactory().dataSource(conf);
    }
}

由于某种原因,DataSource bean 只获取了引用池大小和 maxWait 的属性,而不是 connectionProperties - 请参阅日志输出:

最大活动=4;初始大小=4;最大等待=2000; 连接属性=null

有什么提示吗?

注意:尝试通过 Spring 的 ConnectionConfig 类设置 connectionProperties 也不起作用。

【问题讨论】:

    标签: java tomcat jdbc cloud-foundry spring-cloud


    【解决方案1】:

    尝试使用DataSourceConfig 的形式,它采用单独的PoolConfigConnectionConfig bean,如下所示:

    @Bean
    public DataSource dataSource() {
        PoolConfig poolConfig = new PoolConfig(4, 4, 2000);
        ConnectionConfig connectionConfig = new ConnectionConfig("useUnicode=yes;characterEncoding=utf8;");
        DataSourceConfig dbConfig = new DataSourceConfig(poolConfig, connectionConfig);
        return connectionFactory().dataSource(dbConfig);
    }
    

    【讨论】:

    • 日志仍然显示 connectionProperties=null。事实上,我首先尝试过这种方法,然后才按照这里的建议:github.com/spring-cloud/spring-cloud-connectors/issues/173,使用 DataSourceConfig 的单参数构造函数尝试了我的运气,如我的问题所示。
    • 好的,我知道发生了什么。这是 Tomcat JDBC 库的一个怪癖。如果您查看setConnectionProperties() 方法[1] 的源代码,它实际上会解析属性并设置一个内部dbProperties 字段,而不是内部connectionProperties 字段。 getConnectionProperties() 方法[2] 返回connectionProperties 字段的值,而不是setConnectionProperties() 设置的dbProperties 字段的值。如果您致电DataSource.getDbProperties(),您将看到在ConnectionConfig 中设置的字段。
    • 为了完整性:因为没有方法javax.sql.DataSource.getDbProperties(),您需要将DataSource 对象转换为org.apache.tomcat.jdbc.pool.DataSource 以获得connectionProperties 的正确值。因此,如果您使用 Tomcat JDBC 库,目前无法以与实现无关的方式获取所有您为自定义 DataSource 指定的属性。
    【解决方案2】:

    尝试以下方法:

    替换

    connProperties.put("connectionProperties", "useUnicode=yes;characterEncoding=utf8;");
    

    connProperties.put("connectionProperties", "useUnicode=yes;characterEncoding=UTF-8;");
    

    或者,您也可以直接在application.properties中指定以下属性

    spring.datasource.connectionProperties=useUnicode=true;characterEncoding=utf-8;

    【讨论】:

      猜你喜欢
      • 2020-09-13
      • 2019-08-21
      • 1970-01-01
      • 2023-03-29
      • 2019-06-12
      • 2018-12-15
      • 2016-10-05
      • 2019-07-19
      • 2018-02-15
      相关资源
      最近更新 更多