Java 无法在Cloud Foundry中使用Spring云连接器设置connectionProperties
我正在使用Tomcat JDBC连接池和MariaDB JDBC驱动程序在Cloud Foundry上运行的Spring Boot/Spring Cloud Connectors项目中设置数据源,如下所示:Java 无法在Cloud Foundry中使用Spring云连接器设置connectionProperties,java,tomcat,jdbc,cloud-foundry,spring-cloud,Java,Tomcat,Jdbc,Cloud Foundry,Spring Cloud,我正在使用Tomcat JDBC连接池和MariaDB JDBC驱动程序在Cloud Foundry上运行的Spring Boot/Spring Cloud Connectors项目中设置数据源,如下所示: @Configuration @Profile("cloud") public class MyDataSourceConfiguration extends AbstractCloudConfig { @Bean public DataSource dataSource()
@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);
}
}
@配置
@个人资料(“云”)
公共类MyDataSourceConfiguration扩展了AbstractCloudConfig{
@豆子
公共数据源数据源(){
Map dataSourceProperties=new HashMap();
dataSourceProperties.put(“initialSize”,“4”);//确定
dataSourceProperties.put(“maxActive”,“4”);//确定
dataSourceProperties.put(“maxWait”,“2000”);//确定
dataSourceProperties.put(“connectionProperties”,
“useUnicode=yes;characterEncoding=utf8;”;//已忽略
DataSourceConfig conf=新的DataSourceConfig(dataSourceProperties);
返回connectionFactory().dataSource(conf);
}
}
由于某些原因,DataSource bean只获取引用池大小和maxWait的属性,而不获取connectionProperties-请参阅日志输出:
maxActive=4;初始大小=4;maxWait=2000;
connectionProperties=null
有什么提示吗
注意:尝试通过Spring的ConnectionConfig类设置connectionProperties也不起作用。请尝试以下操作:
替换
connProperties.put("connectionProperties", "useUnicode=yes;characterEncoding=utf8;");
与
或者,您也可以直接在application.properties中指定以下属性
spring.datasource.connectionProperties=useUnicode=true;characterEncoding=utf-8代码>请尝试以下操作:
替换
connProperties.put("connectionProperties", "useUnicode=yes;characterEncoding=utf8;");
与
或者,您也可以直接在application.properties中指定以下属性
spring.datasource.connectionProperties=useUnicode=true;characterEncoding=utf-8
尝试使用DataSourceConfig
的形式,该形式采用单独的PoolConfig
和ConnectionConfig
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);
}
尝试使用DataSourceConfig
的形式,该形式采用单独的PoolConfig
和ConnectionConfig
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。事实上,我首先尝试了这种方法,然后才按照这里的建议,使用DataSourceConfig的one-arg构造函数尝试了我的运气,如我的问题所示。好的,我知道发生了什么。这是TomcatJDBC库的一个怪癖。如果查看setConnectionProperties()
方法[1]的源代码,它实际上解析属性并设置内部dbProperties
字段,而不是内部connectionProperties
字段。getConnectionProperties()
方法[2]返回connectionProperties
字段的值,而不是setConnectionProperties()
设置的dbProperties
字段的值。如果调用DataSource.getDbProperties()
您将看到在ConnectionConfig
[1][2]中设置的字段,只是为了完整:因为没有方法javax.sql.DataSource.getDbProperties()
您需要将DataSource
对象强制转换为org.apache.tomcat.jdbc.pool.DataSource
,以获得connectionProperties
的正确值。因此,如果使用Tomcat JDBC库,目前无法以与实现无关的方式获取为自定义数据源指定的所有属性。日志仍然显示connectionProperties=null。事实上,我首先尝试了这种方法,然后才按照这里的建议,使用DataSourceConfig的one-arg构造函数尝试了我的运气,如我的问题所示。好的,我知道发生了什么。这是TomcatJDBC库的一个怪癖。如果查看setConnectionProperties()
方法[1]的源代码,它实际上解析属性并设置内部dbProperties
字段,而不是内部connectionProperties
字段。getConnectionProperties()
方法[2]返回connectionProperties
字段的值,而不是setConnectionProperties()
设置的dbProperties
字段的值。如果调用DataSource.getDbProperties()
您将看到在ConnectionConfig
[1][2]中设置的字段,只是为了完整:因为没有方法javax.sql.DataSource.getDbProperties()
您需要将DataSource
对象强制转换为org.apache.tomcat.jdbc.pool.DataSource
,以获得connectionProperties
的正确值。因此,如果您使用Tomcat JDBC库,目前无法以与实现无关的方式获取您为定制的数据源指定的所有属性。