¿Cuál es la forma correcta de manejar las conexiones JDBC con Spring y DBCP?

Estoy usando Spring MVC para construir una capa delgada sobre una base de datos de SQL Server. Cuando comencé a probar, parece que no maneja el estrés muy bien :). Estoy usandoApache Commons DBCP para manejar la agrupación de conexiones y la fuente de datos.

Cuando intenté por primera vez ~ 10-15 conexiones simultáneas, solía bloquearse y tenía que reiniciar el servidor (para desarrolladores estoy usando Tomcat, pero eventualmente tendré que implementarlo en Weblogic).

Estas son mis definiciones de Spring Bean:

<bean id="dataSource" destroy-method="close"
      class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
    <property name="url" value="[...]"/>
    <property name="username" value="[...]" />
    <property name="password" value="[...]" />
</bean>

<bean id="partnerDAO" class="com.hp.gpl.JdbcPartnerDAO">
    <constructor-arg ref="dataSource"/>
</bean>

<!-- + other beans -->

Y así es como los uso:

// in the DAO
public JdbcPartnerDAO(DataSource dataSource) {
    jdbcTemplate = new JdbcTemplate(dataSource);
}

// in the controller
@Autowired
private PartnerDAO partnerDAO;

// in the controller method
Collection<Partner> partners = partnerDAO.getPartners(...);

Después de leer un poco, encontré elmaxWait, maxActive ymaxIdle propiedades para elBasicDataSource (deGenericObjectPool) Aquí viene el problema. No estoy seguro de cómo debería configurarlos, en cuanto al rendimiento. Por lo que sé, Spring debería administrar mis conexiones para que no tenga que preocuparme por liberarlas.

<bean id="dataSource" destroy-method="close"
      class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
    <property name="url" value="[...]"/>
    <property name="username" value="[...]" />
    <property name="password" value="[...]" />
    <property name="maxWait" value="30" />
    <property name="maxIdle" value="-1" />
    <property name="maxActive" value="-1" />
</bean>

Primero pusemaxWait, para que no se bloquee y, en su lugar, arroje una excepción cuando no haya ninguna conexión disponible desde el grupo. El mensaje de excepción fue:

No se pudo obtener la conexión JDBC; la excepción anidada es org.apache.commons.dbcp.SQLNestedException: no se puede obtener una conexión, error de grupo Tiempo de espera en espera de objeto inactivo

Hay algunas consultas de larga duración, pero la excepción se produjo independientemente de la complejidad de la consulta.

Luego, configuré maxActive y maxIdle para que no arroje las excepciones en primer lugar. Los valores predeterminados son 8 paramaxActive ymaxIdle (No entiendo por qué); si los configuro a -1 no hay más excepciones lanzadas y todoparece para trabajar bien

Teniendo en cuenta que esta aplicación debe admitir una gran cantidad de solicitudes simultáneas, ¿está bien dejar esta configuración en infinito? ¿Spring realmente administrará mis conexiones, considerando los errores que estaba recibiendo? ¿Debo cambiar aC3P0 considerando que está un poco muerto?

Respuestas a la pregunta(3)

Su respuesta a la pregunta