【问题标题】:Why Oracle's PoolDataSource ignores connectionProperties values?为什么 Oracle 的 PoolDataSource 忽略 connectionProperties 值?
【发布时间】:2015-08-18 00:27:56
【问题描述】:

在我的 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());
}

【问题讨论】:

    标签: java oracle tomcat jdbc


    【解决方案1】:

    反编译PoolDataSourceImpl类后,发现了这段代码:

    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”。

    【讨论】:

      猜你喜欢
      • 2010-11-28
      • 1970-01-01
      • 1970-01-01
      • 2014-09-28
      • 2012-11-09
      • 1970-01-01
      • 2019-10-14
      • 1970-01-01
      • 2021-09-21
      相关资源
      最近更新 更多