Dela via


Prestandaloggare och återanrop

Ladda ned JDBC-drivrutin

Från och med version 13.4 tillhandahåller Microsoft JDBC-drivrutinen för SQL Server ett ramverk för prestandamått för att spåra tidpunkten för kritiska drivrutinsåtgärder. Du kan använda det här ramverket för att observera och analysera beteendet för körning av anslutningar och instruktioner, vilket hjälper dig att identifiera flaskhalsar i svarstiden i programmets interaktioner med SQL Server.

Mått är tillgängliga via två mekanismer som kan användas oberoende av varandra eller tillsammans:

  • Programmatiskt återanrop – Registrera en PerformanceLogCallback för att ta emot metrik i din programkod.
  • Java-loggning – Prenumerera på dedikerade java.util.logging loggare för att samla in mått i loggutdata.

Spårade aktiviteter

Drivrutinen spårar aktiviteter på två nivåer: anslutning och -instruktion.

Aktiviteter på anslutningsnivå

Activity Beskrivning
CONNECTION Total tid för att upprätta en anslutning, inklusive alla underaktiviteter.
PRELOGIN Tid för TDS-förförhandlingar med servern.
LOGIN Tid för handskakning av TDS-inloggning och autentisering.
TOKEN_ACQUISITION Dags att hämta federerade autentiseringstoken när du använder Microsoft Entra-autentisering.

Aktiviteter på instruktionsnivå

Activity Beskrivning
STATEMENT_REQUEST_BUILD Tid på klientsidan för att skapa TDS-begäran (parameterbindning, SQL-bearbetning, paketkonstruktion). Endast tidsmätning; spårar inte undantag.
STATEMENT_FIRST_SERVER_RESPONSE Tid från att skicka begäran till att ta emot det första serversvaret. Endast tidtagning; spårar inte undantag.
STATEMENT_PREPARE Tid för sp_prepare när prepareMethod=prepare.
STATEMENT_PREPEXEC Tid för kombinerad förberedelse och körning via sp_prepexec.
STATEMENT_EXECUTE Tid för instruktionskörning (sp_executesql, sp_execute, direkt SQL eller batch).

Aktivera prestandamått

Alternativ 1: Registrera ett återanrop

Registrera en PerformanceLogCallback för att ta emot prestandadata programmatiskt:

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);
    }
});

Alternativ 2: Konfigurera Java-loggning

Konfigurera java.util.logging för prestandamåttloggarna på FINE nivå.

I en logging.properties fil:

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

Eller programmatiskt:

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

Förbereda metodens effekt på uttalandeaktiviteter

Vilka aktiviteter som spåras för PreparedStatement beror på anslutningsegenskapen prepareMethod. Mer information om prepareMethodfinns i Ange anslutningsegenskaper.

prepareMethod inställning Första körningen Andra exekveringen Tredje+ iteration
prepexec (standardinställning) STATEMENT_EXECUTE (sp_executesql) STATEMENT_PREPEXEC (sp_prepexec) STATEMENT_EXECUTE (sp_execute)
prepare STATEMENT_PREPARE + STATEMENT_EXECUTE STATEMENT_EXECUTE STATEMENT_EXECUTE
none STATEMENT_EXECUTE (direkt SQL) STATEMENT_EXECUTE (direkt SQL) STATEMENT_EXECUTE (direkt SQL)

Anmärkning

Med standardinställningen prepexec skjuter drivrutinen upp förberedelsen utifrån att enkel användning förutsätts. Den andra exekveringen använder sp_prepexec (kombinerad förberedelse och exekvering). Från den tredje körningen och framåt återanvänds det cachelagrade handtaget via sp_execute. Om du vill framtvinga sp_prepexec det första anropet anger du anslutningsegenskapen enablePrepareOnFirstPreparedStatementCall till true.

Exempelloggresultat

Följande utdata visar de aktiviteter som spåras över tre på varandra följande körningar av en PreparedStatement med standardinställningen 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

Se även

Förbättra prestanda och tillförlitlighet med JDBC-drivrutinenAnge anslutningsegenskaper