commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Gábor Lipták (JIRA) <j...@apache.org>
Subject [jira] [Created] (DBCP-400) The documentation of maxOpenPreparedStatements parameter seems to be wrong
Date Fri, 26 Jul 2013 13:52:00 GMT
Gábor Lipták created DBCP-400:
---------------------------------

             Summary: The documentation of maxOpenPreparedStatements parameter seems to be
wrong
                 Key: DBCP-400
                 URL: https://issues.apache.org/jira/browse/DBCP-400
             Project: Commons Dbcp
          Issue Type: Bug
    Affects Versions: 1.4, 1.4.1
            Reporter: Gábor Lipták


We had earlier a datasource, which had no maxOpenPreparedStatements property defined. Something
like this:

{code:xml}
<bean id="basicDataSource" class="org.apache.commons.dbcp.BasicDataSource" init-method="createDataSource"
destroy-method="close">
		<property name="poolPreparedStatements" value="true" />
		<property name="url" value="${datasource.url}" />
		<property name="driverClassName" value="${datasource.driverClassName}" />
		<property name="username" value="${datasource.username}" />
		<property name="password" value="${datasource.password}" />

		<property name="initialSize" value="${datasource.initialSize}" />
		<property name="maxActive" value="${datasource.maxActive}" />
		<property name="maxIdle" value="${datasource.maxIdle}" />
		<property name="minIdle" value="${datasource.minIdle}" />

		<property name="timeBetweenEvictionRunsMillis" value="${datasource.timeBetweenEvictionRunsMillis}"
/>
		<property name="minEvictableIdleTimeMillis" value="${datasource.minEvictableIdleTimeMillis}"
/>
		<property name="maxWait" value="${datasource.maxWait}" />
	</bean>
{code}

Then we wanted to have a parameter to limit the prepared statement pool, so we added a new
line for the maxOpenPreparedStatements (for compatibility reasons we added the line with a
config file having '0' value which should mean unlimited according to the documentation at
http://commons.apache.org/proper/commons-dbcp/configuration.html):

{code:xml}
<bean id="basicDataSource" class="org.apache.commons.dbcp.BasicDataSource" init-method="createDataSource"
destroy-method="close">
		<property name="poolPreparedStatements" value="true" />
		<property name="maxOpenPreparedStatements" value="${datasource.maxOpenPreparedStatements}"
/>		
		<property name="url" value="${datasource.url}" />
		<property name="driverClassName" value="${datasource.driverClassName}" />
		<property name="username" value="${datasource.username}" />
		<property name="password" value="${datasource.password}" />

		<property name="initialSize" value="${datasource.initialSize}" />
		<property name="maxActive" value="${datasource.maxActive}" />
		<property name="maxIdle" value="${datasource.maxIdle}" />
		<property name="minIdle" value="${datasource.minIdle}" />

		<property name="timeBetweenEvictionRunsMillis" value="${datasource.timeBetweenEvictionRunsMillis}"
/>
		<property name="minEvictableIdleTimeMillis" value="${datasource.minEvictableIdleTimeMillis}"
/>
		<property name="maxWait" value="${datasource.maxWait}" />
	</bean>
{code}

We ended up in having the following exception:
{noformat}
Caused by: java.sql.SQLException: MaxOpenPreparedStatements limit reached
	at org.apache.commons.dbcp.PoolingConnection.prepareStatement(PoolingConnection.java:109)
	at org.apache.commons.dbcp.DelegatingConnection.prepareStatement(DelegatingConnection.java:281)
	at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.prepareStatement(PoolingDataSource.java:313)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
...
...
[:1.7.0_07]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)[:1.7.0_07]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)[:1.7.0_07]
	at java.lang.reflect.Method.invoke(Method.java:601)[:1.7.0_07]
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)
	at org.springframework.osgi.service.importer.support.internal.aop.ServiceInvoker.doInvoke(ServiceInvoker.java:58)
	at org.springframework.osgi.service.importer.support.internal.aop.ServiceInvoker.invoke(ServiceInvoker.java:62)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
	at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131)
	at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
	at org.springframework.osgi.service.util.internal.aop.ServiceTCCLInterceptor$1.run(ServiceTCCLInterceptor.java:47)
	at org.springframework.osgi.util.internal.PrivilegedUtils.executeWithCustomTCCL(PrivilegedUtils.java:124)[80:org.springframework.osgi.core:1.2.1]
	at org.springframework.osgi.service.util.internal.aop.ServiceTCCLInterceptor.invokePrivileged(ServiceTCCLInterceptor.java:44)
	at org.springframework.osgi.service.util.internal.aop.ServiceTCCLInterceptor.invoke(ServiceTCCLInterceptor.java:36)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
	at org.springframework.osgi.service.importer.support.LocalBundleContextAdvice.invoke(LocalBundleContextAdvice.java:59)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
	at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131)
	at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
	at $Proxy69.getSpecializedSequenceProvider(Unknown Source)
	at ...)
	... 36 more
Caused by: java.util.NoSuchElementException: Pool exhausted
	at org.apache.commons.pool.impl.GenericKeyedObjectPool.borrowObject(GenericKeyedObjectPool.java:1143)
	at org.apache.commons.dbcp.PoolingConnection.prepareStatement(PoolingConnection.java:107)
	... 67 more
{noformat}

So it turned out, that the documentation is wrong. Only negative numbers like -1 mean unlimited.
0 seems to mean limited to one item. Please correct the documentation to avoid problems of
others.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Mime
View raw message