在我的 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"/>

但是在我的 DAO 代码中,当我检查提取大小时,它没有按预期返回 7000:
if (s.getFetchSize() < 100) {
   log.warn("fetch size is too small: " + s.getFetchSize());
}

最佳答案

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

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

当它解析 connectionProperties 的内容时。

这意味着:
  • 分隔符是“,”而不是“,”
  • 第一个和最后一个字符被丢弃

  • 所以你只需要改变声明:
    connectionProperties="defaultBatchValue=7000,defaultRowPrefetch=7000"
    

    至:
    connectionProperties=" defaultBatchValue=7000, defaultRowPrefetch=7000 "
    

    甚至:
    connectionProperties="_defaultBatchValue=7000, defaultRowPrefetch=7000_"
    

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

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

    关于java - 为什么 Oracle 的 PoolDataSource 会忽略 connectionProperties 值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30626131/

    10-09 00:29