为什么 Oracle 的 PoolDataSource 会忽略 connectionProperties 值?

Con*_*ger 4 java oracle tomcat jdbc

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

<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"/>
Run Code Online (Sandbox Code Playgroud)

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

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

Con*_*ger 5

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

propStrs = cfPropsStr.substring(1, cfPropsStr.length() - 1).split(", ");
Run Code Online (Sandbox Code Playgroud)

当它解析 connectionProperties 的内容时。

这意味着:

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

所以你只需要改变声明:

connectionProperties="defaultBatchValue=7000,defaultRowPrefetch=7000"
Run Code Online (Sandbox Code Playgroud)

到:

connectionProperties=" defaultBatchValue=7000, defaultRowPrefetch=7000 "
Run Code Online (Sandbox Code Playgroud)

甚至:

connectionProperties="_defaultBatchValue=7000, defaultRowPrefetch=7000_"
Run Code Online (Sandbox Code Playgroud)

请注意,开头或结尾不需要使用空格,它可以是任何字符。

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