为什么 Oracle 的 PoolDataSource 忽略 connectionProperties 值?

Why Oracle's PoolDataSource ignores connectionProperties values?

在我的 contex.xml 文件中 Tomcat 我有这个数据源声明:

<Resource name="jdbc/my_ds" auth="Container" factory="oracle.ucp.jdbc.PoolDataSourceImpl" 
          type="oracle.ucp.jdbc.PoolDataSource" description="UCP Pool in Tomcat" 
          connectionFactoryClassName="oracle.jdbc.pool.OracleDataSource" minPoolSize="1" maxPoolSize="10" 
          initialPoolSize="2" inactiveConnectionTimeout="20" setMaxIdleTime="1800" 
          user="my_user" password="my_password" 
          url="jdbc:oracle:thin:@mydb.com:1234:DATABASEID" connectionPoolName="MY_UCPPool" 
          connectionProperties="defaultBatchValue=7000,defaultRowPrefetch=7000" validateConnectionOnBorrow="true"/>

但是在我的 DAO 代码中,当我检查提取大小时它没有按预期返回 7000:

if (s.getFetchSize() < 100) {
   log.warn("fetch size is too small: " + s.getFetchSize());
}

反编译classPoolDataSourceImpl后,找到了这段代码:

propStrs = cfPropsStr.substring(1, cfPropsStr.length() - 1).split(", ");

当它正在解析 connectionProperties 的内容时。

这意味着:

  1. 分隔符是“,”而不是“,”
  2. 第一个和最后一个字符被丢弃

所以你只需要更改声明:

connectionProperties="defaultBatchValue=7000,defaultRowPrefetch=7000"

至:

connectionProperties=" defaultBatchValue=7000, defaultRowPrefetch=7000 "

甚至:

connectionProperties="_defaultBatchValue=7000, defaultRowPrefetch=7000_"

注意开头和结尾不需要空格,可以是任意字符。

使用初始配置,结果将是键 "efaultBatchValue" 和值“7000,defaultRowPrefetch=700”。