performance - conexiones - Aumente la carga y disminuya el rendimiento mientras reemplaza DBCP a Tomcat JDBC-pool
tomcat 9 datasource configuration example (2)
Su diagnóstico es extraño: la versión DBCP de AFAIK Tomcat es solo una versión reenvasada de commons-dbcp ... por lo que cambiar de una a otra no debe llevar a ningún cambio en el comportamiento o el rendimiento. (ver here )
Sin embargo, lo que puede haber cambiado es la versión o versiones que usa: en particular, tenga cuidado con las diferencias 1.3 / 1.4. (ver here )
De todos modos, su configuración parece estar bien (y de hecho funciona, a pesar de los problemas que pueda experimentar). Actualizar sus bibliotecas probablemente fue la única forma de resolver sus problemas sin ingresar al modo de depuración ...
Para ir más lejos, ¿podría ser más específico acerca de lo que quiere decir con "problemas con fugas de conexión y puntos muertos en DBCP"? Es un diagnóstico bastante preciso para determinar que existe un vínculo entre los interbloqueos y el grupo de conexión: ¿cómo llegó a esto? Puede estar experimentando interbloqueos porque sus sentencias de SQL son propensas a hacer que se produzcan interbloqueos, mientras que la agrupación solo lo hace posible al proporcionar muchas conexiones simultáneamente, lo que en realidad es su trabajo.
Después de problemas con la fuga de conexión y puntos muertos en DBCP, decidimos reemplazarlo con Tomcat JDBC-pool. Por supuesto que la migración era realmente simple.
Pero después de implementarlo en un entorno de producción, noté que la carga en un servidor con dos Tomcats en ejecución aumenta de 4-4.5 a 5.5. No hicimos nada más, excepto cambio de grupo. Además, el rendimiento medido con JMeter disminuye aproximadamente un 5%.
Pasé un tiempo para ajustar los parámetros de la piscina, pero sin efectos visibles. He pegado mi configuración actual (de <GlobalNamingResources>
en server.xml
) a continuación:
<Resource name="jdbc/xxxxxx"
auth="Container"
type="javax.sql.DataSource"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
initialSize="10"
maxActive="100"
minIdle="10"
maxIdle="50"
maxWait="10000"
testOnBorrow="true"
testOnReturn="false"
testOnConnect="false"
testWhileIdle="false"
validationQuery="SELECT 1 from dual"
validationInterval="30000"
suspectTimeout="60"
timeBetweenEvictionRunsMillis="30000"
removeAbandonedTimeout="60"
removeAbandoned="true"
logAbandoned="true"
abandonWhenPercentageFull="50"
minEvictableIdleTimeMillis="60000"
jmxEnabled="true"
username="xxxxx"
password="xxxxx"
driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:oci:xxxxx"/>
FairQueue y PoolSweeperEnabled son ciertos
En Spring applicationContext-jdbc.xml solo tengo:
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="resourceRef">
<value>true</value>
</property>
<property name="jndiName">
<value>java:comp/env/jdbc/PortalDB</value>
</property>
</bean>
¿Qué estoy haciendo mal? Pensé, que JDBC_pool debería ser más rápido que DBCP fuera de la caja.
Tu configuración y afinación parecen correctas. Su aumento de carga puede deberse a que el servidor maneje más solicitudes simultáneas al mismo tiempo. Es posible que DBCP haya impedido que el servidor asuma esta carga debido a cómo bloqueó la agrupación de todos los subprocesos. El jdbc-pool no hace esto, por lo que ahora ha aumentado su concurrencia. Y si la carga aumenta, la respuesta puede disminuir, pero su rendimiento aumentará.
Empezaría a sintonizar
maxActive
para que coincida con su maxThreads con el fin de manejar la concurrencia.