2012-12-06 10 views
15

Dopo aver riscontrato problemi di perdita di connessione e deadlock in DBCP, abbiamo deciso di sostituirlo con Tomcat JDBC-pool. Ovviamente la migrazione è stata davvero semplice.Aumentare il carico e ridurre le prestazioni sostituendo DBCP con Tomcat JDBC-pool

Ma dopo averlo distribuito in un ambiente di produzione ho notato che il caricamento su un server con due Tomcat in esecuzione aumenta da 4-4.5 a 5.5. Non abbiamo fatto nulla di più, tranne il cambio di piscina. Inoltre, le prestazioni misurate con JMeter diminuiscono di circa il 5%.

Ho trascorso un po 'di tempo per mettere a punto i parametri del pool, ma senza effetti visibili. Ho incollato il mio config corrente (da <GlobalNamingResources> in server.xml) qui di seguito:

<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 e PoolSweeperEnabled sono vere

Nella primavera applicationContext-jdbc.xml ho solo:

<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> 

Che cosa sono io fare male? Ho pensato che JDBC_pool dovrebbe essere più veloce di DBCP fuori dalla scatola.

+0

Provare testWhenIdle = "true", e anche provare a minimizzare il numero di maxActive da 100 a qualcosa come 20. Forse avere troppe connessioni nel pool sta rallentando le cose. –

+1

Stai utilizzando la stessa query di validazione di prima? – rootkit

+0

@ rootkit007 - no, con dbcp non ho usato la query di validazione ant. – Dzinek

risposta

0

La tua diagnosi è strana: la DBCP di AFAIK Tomcat è solo una versione riconfezionata di commons-dbcp ... quindi il passaggio dall'uno all'altro non dovrebbe comportare alcun cambiamento nel comportamento o nelle prestazioni. (vedi here)

Ciò che può essere cambiato anche se è la versione (s) che si utilizza: in particolare, fate attenzione alle differenze 1,3/1,4. (vedi here)

In ogni caso, la tua configurazione sembra a posto (e funziona davvero, nonostante i problemi che potresti riscontrare). L'aggiornamento delle tue librerie era probabilmente l'unico modo per risolvere i tuoi problemi senza entrare in modalità di debug ...

Per andare oltre, potresti essere più specifico su cosa intendi per "problemi di perdita di connessione e deadlock in DBCP"? È una diagnosi abbastanza precisa per stabilire che esiste un collegamento tra deadlock e pool di connessioni: come sei arrivato a questo? Potrebbero esserci problemi di deadlock perché le tue istruzioni SQL tendono a creare deadlock, mentre il pool lo rende possibile solo fornendo molte connessioni simultaneamente - il che è solo il suo lavoro in realtà.

+0

OP sta parlando di Tomcat jdbc-pool, che è diverso dal dbcp riconfezionato di Tomcat. http://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html – dnault

1

Le impostazioni e la sintonizzazione appaiono corrette. L'aumento del carico può essere dovuto al fatto che il server gestisce contemporaneamente più richieste simultanee. DBCP potrebbe aver impedito al server di assumere questo carico a causa del modo in cui ha bloccato il pool da tutti i thread. Jdbc-pool non lo fa, quindi ora hai aumentato la concorrenza. E se il carico aumenta, la risposta potrebbe diminuire, ma il rendimento aumenterebbe.

mi piacerebbe iniziare la sintonizzazione

maxActive 

per abbinare i vostri maxThreads al fine di gestire la concorrenza.

Problemi correlati