2014-11-05 11 views
5

Sto utilizzando l'avvio a molla e l'ibernazione su jpa con il pool di connessione di tomcat. Potete per favore aiutarmi a capire come molla usa le connessioni DB durante le transazioni. Ad esempio, si consideri il seguente scenario:Limite di transazione primaverile e connessione DB in attesa

  1. Abbiamo un pool di connessione DB di 2 connessioni.
  2. Spring avvia una transazione, ad esempio il metodo di chiamata decorato con l'annotazione @Transactional.
  3. Questo metodo fare un aggiornamento DB
  4. Il chiama un servizio esterno
  5. Come risposta viene ricevuta dal servizio esterno, aggiorna DB e ritorno.
  6. Primavera commit della transazione

Supponendo che il servizio esterno (fase 4) dura circa 1 minuto per completare, quante connessioni DB sarà disponibile nel pool DB ?. Supponendo che la molla manterrà la connessione DB fino al completamento della transazione, ci sarà una sola connessione DB disponibile per qualsiasi richiesta ricevuta durante questo periodo e se avremo ricevuto più di 1 richieste, dovranno attendere la connessione DB.

Si prega di confermare la mia comprensione e, se è corretta, suggerire come posso gestire questa situazione in un sistema ad alto volume di transazioni.

Grazie

risposta

5

Innanzitutto la vostra comprensione è corretta. Vedi la documentazione di primavera su declarative transaction management.

enter image description here

immagino che fate la chiamata di servizio esterna all'interno della transazione, perché si desidera che le modifiche al database per essere annullate da una rollback in caso di un'eccezione. In altre parole, si desidera che gli aggiornamenti db riflettano lo stato della chiamata di servizio esterna.

In tal caso non è possibile spostarlo fuori dal limite della transazione. In questo caso, è necessario aumentare la dimensione del pool di connessioni o magari delegare transazioni a esecuzione prolungata a un nodo server dedicato che li gestisce. Ciò manterrebbe per es. un nodo del server "principale" che gestisce le richieste degli utenti dalle transazioni di lunga durata.

E dovresti pensare alla consistenza dei dati. È davvero necessario che l'aggiornamento db sia sincronizzato con la chiamata di servizio esterna? La chiamata di servizio esterna può essere spostata fuori dal limite della transazione?

2

È possibile specificare dimensione iniziale e la dimensione massima del pool di connessione secondo il vostro requisito (dipende dalle prestazioni della vostra applicazione).

Per esempio,

<bean id="springDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" > 
    <property name="url" value="jdbc:oracle:thin:@localhost:1521:SPRING_TEST" /> 
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /> 
    <property name="username" value="root" /> 
    <property name="password" value="root" /> 
    <property name="removeAbandoned" value="true"/> 
    <property name="initialSize" value="20" /> 
    <property name="maxActive" value="30" /> 
</bean> 

questo creerà 20 di connessione al database come InitialSize è 20 e va fino al 30 di connessione al database, se richiesto come maxActive è 30. è possibile personalizzare il pool di connessione database utilizzando le proprietà diverse fornite dalla libreria Apache DBCP. Sopra l'esempio è la creazione di pool di connessioni con il database Oracle 11g e sto usando oracle.jdbc.driver.OracleDriver arriva con ojdbc6.jar o ojdbc6_g.jar

Problemi correlati