问题复现
项目上历史项目为解决漏洞扫描从Tomcat 6.0升级到了9.0版本,服务启动的日志显示如下警告,数据源是通过JNDI方式在server.xml中配置的,控制台上狂刷无法找到表空间的错误(没截图)
报错:
06-Nov-2024 10:32:03.701 警告 [main] java.util.ArrayList.forEach Name = 数据源 Property maxActive is not used in DBCP2, use maxTotal instead. maxTotal default value is 8. You have set value of "1000" for "maxActive" property, which is being ignored.
06-Nov-2024 10:32:03.708 警告 [main] java.util.ArrayList.forEach Name = 数据源 Property maxWait is not used in DBCP2 , use maxWaitMillis instead. maxWaitMillis default value is PT-0.001S. You have set value of "10000" for "maxWait" property, which is being ignored.
server.xml的JNDI数据源配置示意:
<Context path="/test" docBase="test" debug="1" reloadable="true" crossContext="true"><Resource auth="Container" name="jdbc/test" type="javax.sql.DataSource" driverClassName="oracle.jdbc.driver.OracleDriver" maxActive="1000" maxIdle="300" maxWait="10000" url="jdbc:oracle:thin:@10.2.99.99:1521/CLCDB" username="test" password="test" />
</Context>
问题出现原因
翻了翻官网迁移文档,发现Tomcat 8开始修改了默认的内建数据源版本,由DBCP1升级到DBCP2。DBCP1的实现被复制到工厂org.apache.tomcat.jdbc.pool.DataSourceFactory
,DBCP2使用common-dbcp新实现。
- https://tomcat.apache.org/migration-8.html
- https://tomcat.apache.org/tomcat-8.0-doc/jdbc-pool.html#JNDI_Factory_and_Type
解决方法
解决数据源问题需要从定义连接处的工厂决定使用哪个DBCP连接池版本。
在Resource添加 factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
,以指定连接池。
<Context path="/test" docBase="test" debug="1" reloadable="true" crossContext="true"><Resource auth="Container" name="jdbc/test" factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" type="javax.sql.DataSource" driverClassName="oracle.jdbc.driver.OracleDriver" maxActive="1000" maxIdle="300" maxWait="10000" url="jdbc:oracle:thin:@10.2.99.99:1521/CLCDB" username="test" password="test" />
</Context>