Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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
PerformanceLogCallbackför att ta emot metrik i din programkod. -
Java-loggning – Prenumerera på dedikerade
java.util.loggingloggare 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 tidsmätning; 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);
}
});
Använd nanosekundtiming och uttalandeskontext
Från och med version 13.6 kan ett återanrop välja att använda tidtagning på nanosekundnivå genom att åsidosätta useNanoseconds(). Callbacken kan också anropa getCurrentUserSql() och getCurrentStatementType() för att korrelera en händelse på satsnivå med SQL-texten som skickats in av applikationen och typen av sats som kördes.
getCurrentStatementType() returnerar STATEMENT, PREPARED_STATEMENT, eller CALLABLE_STATEMENT. Använd getCurrentApplicationName() för att identifiera anslutningen eller poolen som producerade en händelse från dess applicationName anslutningsegenskap. Om applicationName inte är inställd returnerar metoden drivrutinens standardapplikationsnamn.
SQLServerDriver.registerPerformanceLogCallback(new PerformanceLogCallback() {
@Override
public boolean useNanoseconds() {
return true;
}
@Override
public void publish(PerformanceActivity activity, int connectionId,
long durationNs, Exception exception) {
// Connection-level metrics don't have SQL statement context.
System.out.printf("Application: %s, Activity: %s, Connection: %d, Duration: %d ns%n",
getCurrentApplicationName(), activity, connectionId, durationNs);
}
@Override
public void publish(PerformanceActivity activity, int connectionId,
int statementId, long durationNs, Exception exception) {
String applicationName = getCurrentApplicationName();
String userSql = getCurrentUserSql();
StatementType statementType = getCurrentStatementType();
System.out.printf("Application: %s, Type: %s, Activity: %s, SQL: %s, Duration: %d ns%n",
applicationName, statementType, activity, userSql, durationNs);
}
});
Tidtagning med nanosekundprecision är valbar. Återanrop som inte åsidosätter useNanoseconds() fortsätter att ta emot tidsvärden i millisekunder. När en registrerad callback har aktiverats använder även den dedikerade prestandaloggens utdata nanosekunder och anger tidslängder med ns; annars används millisekunder och ms. Att anropa System.nanoTime() kan medföra mer overhead än System.currentTimeMillis() på vissa plattformar.
Callback-kontexten är endast tillgänglig under motsvarande publish() anrop.
getCurrentApplicationName() är tillgänglig för händelser på anslutningsnivå och satsnivå och returnerar null utanför publish(). Den kan också returnera null när anslutningsegenskaper inte har tolkats, till exempel när en anslutning misslyckas innan applikationsnamnet har lösts. SQL-kontextmetoderna returnerar null för anslutningsnivåhändelser, satsdelaktivitetsmetriker som inte har SQL-kontext och anrop som görs utanför publish().
Caution
SQL-text kan innehålla känslig data i literaler eller kommentarer. Sanera den och tillämpa organisationens krav på datahantering innan du skriver in den i loggar eller telemetri.
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