为什么 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 的内容时。
这意味着:
- 分隔符是“,”而不是“,”
- 第一个和最后一个字符被丢弃
所以你只需要更改声明:
connectionProperties="defaultBatchValue=7000,defaultRowPrefetch=7000"
至:
connectionProperties=" defaultBatchValue=7000, defaultRowPrefetch=7000 "
甚至:
connectionProperties="_defaultBatchValue=7000, defaultRowPrefetch=7000_"
注意开头和结尾不需要空格,可以是任意字符。
使用初始配置,结果将是键 "efaultBatchValue" 和值“7000,defaultRowPrefetch=700”。
在我的 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 的内容时。
这意味着:
- 分隔符是“,”而不是“,”
- 第一个和最后一个字符被丢弃
所以你只需要更改声明:
connectionProperties="defaultBatchValue=7000,defaultRowPrefetch=7000"
至:
connectionProperties=" defaultBatchValue=7000, defaultRowPrefetch=7000 "
甚至:
connectionProperties="_defaultBatchValue=7000, defaultRowPrefetch=7000_"
注意开头和结尾不需要空格,可以是任意字符。
使用初始配置,结果将是键 "efaultBatchValue" 和值“7000,defaultRowPrefetch=700”。