Warum der R2DBC-Verbindungspool MAX-Verbindungen zuweist, wenn diese von der Anwendung nicht benötigt werden?Java

Java-Forum
Guest
 Warum der R2DBC-Verbindungspool MAX-Verbindungen zuweist, wenn diese von der Anwendung nicht benötigt werden?

Post by Guest »

Ich habe eine reaktive JAVA-Spring-Boot-Anwendung mit R2DBC-MySQL mit der folgenden Konfiguration:

Code: Select all

spring.r2dbc.pool.enabled=true
spring.r2dbc.pool.initial-size=0
spring.r2dbc.pool.max-size=20
spring.r2dbc.pool.max-acquire-time=30s
spring.r2dbc.pool.max-idle-time=1m
Meine Anwendung verfügt über zwei Arbeitsabläufe:
A. Daten für die Verarbeitung generieren – Verwendet 1 Thread
  • Dies verbraucht Nachrichten von SQS und verwendet sie zur Datenvorbereitung.
    < /li>
    processMessage-Methode ist eine reaktive Methode, die Nachrichten verarbeitet und Daten im reaktiven Fluss generiert. Habe .block verwendet, da ich den Sitzungsbestätigungsmodus als CLIENT_ACKNOWLEDGE verwendet habe

    Code: Select all

    myConsumerService.processMessage(message).block();
B. Daten verarbeiten – Verwendet 10 Threads
  • Ein einzelner Thread verarbeitet diese 3 Vorgänge nacheinander.

    Jeder MySQL-Vorgang wird innerhalb von zweistelligen Millisekunden abgeschlossen.
  • Der folgende Code wurde verwendet, um Datensätze abzurufen für MySQL-Operationen:

    Code: Select all

     public class MyRepository {
    
    private final R2dbcEntityTemplate template;
    
    public MyRepository(R2dbcEntityTemplate template) {
    this.template = template;
    }
    
    public Mono getEntityById(Long id) {
    return template.select(MyEntity.class)
    .matching(Query.query(Criteria.where("id").is(id))).one();
    }
    }
    
Ich habe den DEBUG-Protokollierungsmodus für R2DBC verwendet(

Code: Select all

logging.level.io.r2dbc.pool=DEBUG
) und es zeigt, dass die Verbindung unmittelbar vor dem MySQL-Vorgang hergestellt und unmittelbar nach dem MySQL-Vorgang freigegeben wird.
Erwartetes Ergebnis: Die Anwendung soll maximal verwendet werden 11 Verbindungen, daher sollten es 11 von der R2DBC-Verbindung zugewiesene Verbindungen sein.
Tatsächliches Ergebnis: Protokolle zeigen, dass 20 Verbindungen vom R2DBC-Verbindungspool zugewiesen wurden.
Hier ist das Protokoll, das ich beobachtet habe:
ConnectionPoolStats: Zugewiesen: 20, Erworben: 1, Leerlauf: 0, Ausstehend: 9
Zu Referenzzwecken habe ich den folgenden Code verwendet, um ConnectionPoolStats abzurufen:< /p>

Code: Select all

 PoolMetrics metrics = connectionPool.getMetrics().orElse(null);

if (metrics != null) {
String connectionPoolStats = String.format("Allocated : %d, Acquired : %d, Idle : %d, Pending : %d",
metrics.allocatedSize(), metrics.acquiredSize(),
metrics.idleSize(), metrics.pendingAcquireSize());
logger.info("ConnectionPoolStats : {}",  connectionPoolStats);
} else {
System.out.println("Connection Pool Metrics are not available.");
}
Fragen:
  • Warum alle Verbindungen als Zuordnung angezeigt werden, die Anwendung jedoch nicht zu irgendeinem Zeitpunkt erforderlich?
  • Besteht eine Wahrscheinlichkeit, dass ich zu einem ungewöhnlichen Verbindungsstatus führe?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post