2014-11-05 13 views
5

Ich benutze Spring Boot und Winterschlaf über Jpa mit Tomcat Connection Pooling. Können Sie mir bitte helfen, zu verstehen, wie der Frühling DB-Verbindungen während der Transaktionen benutzt. Zum Beispiel folgendes Szenario in Betracht ziehen:Spring Transaktion Grenze und DB-Verbindung mit

  1. Wir haben DB Verbindungspool von 2 Verbindungen.
  2. Spring startet eine Transaktion, d. H. Aufrufmethode, die mit @Transactional Annotation versehen ist.
  3. Diese Methode tun, um ein DB-Update
  4. Die externe Dienstleistung
  5. Als Reaktion fordert von dem externen Dienst empfangen wird, aktualisiert er DB und zurück.
  6. Frühling verpflichtet die Transaktion

den externen Dienst Angenommen (Schritt 4) dauert nur 1 Minute zu vervollständigen, wie viele DB-Verbindungen wird im DB-Pool zur Verfügung ?. Angenommen, Spring hält die DB-Verbindung aufrecht, bis die Transaktion abgeschlossen ist. Für jede Anfrage, die während dieser Zeit empfangen wird, steht nur eine DB-Verbindung zur Verfügung. Wenn wir mehr als eine Anfrage erhalten haben, müssen sie auf die DB-Verbindung warten.

Bitte bestätigen Sie mein Verständnis und wenn es korrekt ist, schlagen Sie vor, wie ich mit dieser Situation in einem System mit hohen Transaktionsvolumen umgehen kann.

Dank

Antwort

5

Zuerst ist Ihr Verständnis richtig. Siehe die Frühlingsdokumentation über declarative transaction management.

enter image description here

Ich denke, Sie tun den externen Service-Aufruf innerhalb der Transaktion, da Sie die Datenbankänderungen wollen rollbacked im Fall einer Ausnahme werden. Oder anders ausgedrückt: Sie möchten, dass die DB-Aktualisierungen den Status des externen Serviceaufrufs widerspiegeln.

Wenn ja, können Sie die Transaktionsgrenze nicht verschieben. In diesem Fall sollten Sie entweder die Größe des Verbindungspools erhöhen oder Sie können lang laufende Transaktionen an einen dedizierten Serverknoten delegieren, der sie verarbeitet. Dies würde z.B. ein "Haupt" -Serverknoten, der Benutzeranforderungen von lang laufenden Transaktionen abhält.

Und Sie sollten über die Datenkonsistenz nachdenken. Ist es wirklich notwendig, dass das Datenbank-Update mit dem externen Service-Aufruf synchronisiert werden muss? Kann der externe Serviceaufruf aus der Transaktionsgrenze herausgenommen werden?

2

Sie Anfangsgröße und die maximale Größe des Verbindungspools wie pro Ihre Anforderung angeben kann (abhängig von der Leistung Ihrer Anwendung).

Zum Beispiel

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

dieser 20 Datenbankverbindung erstellen als Urspr 20 und geht bis 30 Datenbankverbindung, wenn wie maxActive erforderlich ist 30. Sie Ihren Datenbankverbindungspool durch die Verwendung unterschiedliche Eigenschaften anpassen können zur Verfügung gestellt von Apache DBCP-Bibliothek. Obiges Beispiel erstellt Verbindungspool mit Oracle 11g Datenbank und ich verwende oracle.jdbc.driver.OracleDriver kommt zusammen mit ojdbc6.jar oder ojdbc6_g.jar

Verwandte Themen