Condividi tramite


Logger delle prestazioni e callback

Scaricare il driver JDBC

A partire dalla versione 13.4, Microsoft JDBC Driver per SQL Server offre un framework delle metriche delle prestazioni per tenere traccia della tempistica delle operazioni critiche del driver. È possibile usare questo framework per osservare e analizzare il comportamento di esecuzione delle istruzioni e delle connessioni, consentendo di identificare i colli di bottiglia della latenza nelle interazioni dell'applicazione con SQL Server.

Le metriche sono disponibili tramite due meccanismi che possono essere usati in modo indipendente o insieme:

  • Callback programmatico: registrare un oggetto PerformanceLogCallback per ricevere le metriche nel codice dell'applicazione.
  • Registrazione Java : sottoscrivere logger dedicati java.util.logging per acquisire le metriche nell'output del log.

Attività rilevate

Il driver tiene traccia delle attività a due livelli: connessione e dichiarazione.

Attività a livello di connessione

Activity Descrizione
CONNECTION Tempo totale per stabilire una connessione, incluse tutte le attività secondarie.
PRELOGIN Tempo necessario per la negoziazione pre-accesso TDS con il server.
LOGIN È il momento di eseguire l'handshake per l'accesso e l'autenticazione TDS.
TOKEN_ACQUISITION Tempo necessario per acquisire token di autenticazione federati quando si usa l'autenticazione Microsoft Entra.

Operazioni a livello di dichiarazione

Activity Descrizione
STATEMENT_REQUEST_BUILD Tempo sul lato client per compilare la richiesta TDS (associazione di parametri, elaborazione SQL, costruzione di pacchetti). Solo monitoraggio temporale; non tiene traccia delle eccezioni.
STATEMENT_FIRST_SERVER_RESPONSE Tempo trascorso dall'invio della richiesta alla ricezione della prima risposta del server. Solo monitoraggio del tempo; non rileva le eccezioni.
STATEMENT_PREPARE Tempo per sp_prepare quando prepareMethod=prepare.
STATEMENT_PREPEXEC Tempo per la preparazione combinata ed esecuzione tramite sp_prepexec.
STATEMENT_EXECUTE Tempo per l'esecuzione dell'istruzione (sp_executesql, sp_execute, SQL diretto o batch).

Abilitare le metriche delle prestazioni

Opzione 1: Registrare un callback

Registrare un PerformanceLogCallback oggetto per ricevere i dati sulle prestazioni a livello di codice:

SQLServerDriver.registerPerformanceLogCallback(new PerformanceLogCallback() {
    @Override
    public void publish(PerformanceActivity activity, int connectionId,
            long durationMs, Exception exception) {
        // Connection-level metrics
        System.out.printf("Activity: %s, Connection: %d, Duration: %d ms%n",
                activity, connectionId, durationMs);
    }

    @Override
    public void publish(PerformanceActivity activity, int connectionId,
            int statementId, long durationMs, Exception exception) {
        // Statement-level metrics
        System.out.printf("Activity: %s, Connection: %d, Statement: %d, Duration: %d ms%n",
                activity, connectionId, statementId, durationMs);
    }
});

Opzione 2: Configurare la registrazione Java

Configurare java.util.logging i logger delle metriche delle prestazioni a FINE livello.

In un logging.properties file:

com.microsoft.sqlserver.jdbc.PerformanceMetrics.Connection.level = FINE
com.microsoft.sqlserver.jdbc.PerformanceMetrics.Statement.level = FINE
handlers = java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level = FINE

Oppure a livello di codice:

Logger.getLogger("com.microsoft.sqlserver.jdbc.PerformanceMetrics.Connection")
      .setLevel(Level.FINE);
Logger.getLogger("com.microsoft.sqlserver.jdbc.PerformanceMetrics.Statement")
      .setLevel(Level.FINE);

Preparare l'effetto del metodo sulle attività delle dichiarazioni

Le attività tracciate per PreparedStatement dipendono dalla proprietà di connessione prepareMethod. Per altre informazioni su prepareMethod, vedere Impostazione delle proprietà di connessione.

impostazione prepareMethod Prima esecuzione Seconda esecuzione +Terza esecuzione
prepexec (impostazione predefinita) STATEMENT_EXECUTE (sp_executesql) STATEMENT_PREPEXEC (sp_prepexec) STATEMENT_EXECUTE (sp_execute)
prepare STATEMENT_PREPARE + STATEMENT_EXECUTE STATEMENT_EXECUTE STATEMENT_EXECUTE
none STATEMENT_EXECUTE (SQL diretto) STATEMENT_EXECUTE (SQL diretto) STATEMENT_EXECUTE (SQL diretto)

Annotazioni

Con l'impostazione predefinita prepexec , il driver rinvia la preparazione presupponendo un singolo utilizzo. La seconda esecuzione usa sp_prepexec (preparazione combinata ed esecuzione). A partire dalla terza esecuzione, l'handle memorizzato nella cache viene riutilizzato tramite sp_execute. Per forzare sp_prepexec alla prima chiamata, impostare la proprietà di connessione enablePrepareOnFirstPreparedStatementCall su true.

Output del log di esempio

L'output seguente mostra le attività rilevate tra tre esecuzioni consecutive di un PreparedStatement oggetto con l'impostazione predefinita prepexec :

ConnectionID:1, StatementID:1 Request build time, duration: 8ms
ConnectionID:1, StatementID:1 First server response, duration: 17ms
ConnectionID:1, StatementID:1 Statement execute, duration: 75ms        ← 1st call: sp_executesql
ConnectionID:1, StatementID:1 Request build time, duration: 9ms
ConnectionID:1, StatementID:1 First server response, duration: 0ms
ConnectionID:1, StatementID:1 Statement prepexec, duration: 0ms        ← 2nd call: sp_prepexec
ConnectionID:1, StatementID:1 Request build time, duration: 0ms
ConnectionID:1, StatementID:1 First server response, duration: 0ms
ConnectionID:1, StatementID:1 Statement execute, duration: 0ms         ← 3rd call: sp_execute

Vedere anche

Miglioramento delle prestazioni e dell'affidabilità con il driver JDBCImpostazione delle proprietà di connessione