The db-components.xml file includes the following explanations of "maxActive" and "maxIdle" properties:
<!-- The maximum number of active connections that can be allocated from this pool at the same time, or zero for no limit. -->
<property name="maxActive">
...
<!-- The maximum number of active connections that can remain idle in the pool, without extra ones being released, or zero for no limit. -->
<property name="maxIdle">
However, DBCP actually accepts zero at face value. As documented at
http://commons.apache.org/dbcp/apidocs/org/apache/commons/dbcp/BasicDataSource.html , negative numbers are used to mean unlimited. When I tried to disable idle pool cleanup by setting maxIdle to zero, DBCP instead went into obsessive-compulsive cleanup: every time a client requested a database connection, DBCP would create 10 and then throw all 10 away as quickly as possible, so as to maintain an empty idle pool.