Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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
PerformanceLogCallbackper ricevere le metriche nel codice dell'applicazione. -
Registrazione Java : sottoscrivere logger dedicati
java.util.loggingper 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 temporale; non tiene traccia delle 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);
}
});
Usa la tempistica dei nanosecondi e il contesto delle affermazioni
A partire dalla versione 13.6, un callback può optare per la temporizzazione in nanosecondi sovrascrivendo useNanoseconds(). Il callback può anche chiamare getCurrentUserSql() e getCurrentStatementType() correlare un evento a livello di istruzione con il testo SQL inviato dall'applicazione e il tipo di istruzione eseguita.
getCurrentStatementType() restituisce STATEMENT, PREPARED_STATEMENT, oppure CALLABLE_STATEMENT. Utilizza getCurrentApplicationName() per identificare la connessione o il pool che ha generato un evento tramite la relativa proprietà di connessione applicationName. Se applicationName non è impostato, il metodo restituisce il nome predefinito dell'applicazione del driver.
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);
}
});
La temporizzazione al nanosecondo è facoltativa. Le callback che non ridefiniscono useNanoseconds() continuano a ricevere valori di durata in millisecondi. Quando un callback registrato opta per partecipare, anche l'output dedicato del registratore delle prestazioni utilizza nanosecondi e etichetta le durate con ns; altrimenti, utilizza millisecondi e ms. Chiamare System.nanoTime() può comportare un overhead maggiore rispetto a System.currentTimeMillis() su alcune piattaforme.
Il contesto di callback è disponibile solo durante l'invocazione corrispondente publish() .
getCurrentApplicationName() è disponibile per eventi a livello di connessione e a livello di istruzione e restituisce null al di fuori di publish(). Può anche restituirsi null quando le proprietà della connessione non sono state analizzate, ad esempio quando una connessione fallisce prima che il nome dell'applicazione venga risolto. I metodi del contesto SQL restituiscono null per gli eventi a livello di connessione, per le metriche di sottoattività delle istruzioni che non dispongono di un contesto SQL e per le chiamate effettuate al di fuori di publish().
Caution
Il testo SQL può contenere dati sensibili in letterali o commenti. Sterilizzalo e applica i requisiti di gestione dei dati della tua organizzazione prima di scriverli nei log o nella telemetria.
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