Teljesítménynaplózó és visszahívás

JDBC-illesztőprogram letöltése

A 13.4-es verziótól kezdve az SQL Serverhez készült Microsoft JDBC-illesztőprogram teljesítménymetrika-keretrendszert biztosít a kritikus illesztőprogram-műveletek időzítésének nyomon követéséhez. Ezzel a keretrendszerrel megfigyelheti és elemezheti a kapcsolat- és utasításvégrehajtási viselkedést, így azonosíthatja az alkalmazás SQL Serverrel való interakcióinak késési szűk keresztmetszeteit.

A metrikák két, egymástól függetlenül vagy együtt használható mechanizmussal érhetők el:

  • Programozott visszahívás – Regisztráljon PerformanceLogCallback-t, hogy metrikákat fogadjon az alkalmazáskódban.
  • Java-naplózás – Előfizetés dedikált java.util.logging naplózókra a metrikák naplózásához a naplókimenetben.

Nyomon követett tevékenységek

A vezérlőprogram két szinten követi nyomon a tevékenységeket: kapcsolat és utasítás szinten.

Kapcsolatszintű tevékenységek

Activity Leírás
CONNECTION A kapcsolat létrehozásához szükséges teljes idő, beleértve az összes altevékenységet is.
PRELOGIN A TDS bejelentkezés előtti egyeztetés ideje a kiszolgálóval.
LOGIN A TDS bejelentkezési és hitelesítési kézfogásának ideje.
TOKEN_ACQUISITION Ideje összevont hitelesítési jogkivonatokat beszerezni a Microsoft Entra-hitelesítés használatakor.

Nyilatkozati szintű tevékenységek

Activity Leírás
STATEMENT_REQUEST_BUILD Ügyféloldali idő a TDS-kérés létrehozásához (paraméterkötés, SQL-feldolgozás, csomagépítés). Csak időzítés; nem követi nyomon a kivételeket.
STATEMENT_FIRST_SERVER_RESPONSE A kérés elküldésének ideje az első kiszolgálói válasz fogadásához. Csak időzítés; nem követi nyomon a kivételeket.
STATEMENT_PREPARE A következő időpontra sp_preparevonatkozó prepareMethod=prepare idő: .
STATEMENT_PREPEXEC A kombinált előkészítés és végrehajtás ideje sp_prepexec-on keresztül.
STATEMENT_EXECUTE Az utasítás végrehajtásának ideje (sp_executesql, sp_execute, közvetlen SQL, vagy köteg).

Teljesítménymetrikák engedélyezése

1. lehetőség: Visszahívás regisztrálása

Regisztráljon egy PerformanceLogCallback-t, hogy programozott módon fogadja a teljesítményadatokat:

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

Nanomásodperces időzítés és utasításkörnyezet használata

A 13.6-os verziótól kezdve egy visszahívás a useNanoseconds() felülírásával engedélyezheti a nanoszekundumos időzítést. A visszahívás a getCurrentUserSql() és a getCurrentStatementType() elemet is meghívhatja, hogy egy utasításszintű eseményt összekapcsoljon az alkalmazás által elküldött SQL-szöveggel és a végrehajtott utasítás típusával. getCurrentStatementType() visszaadja STATEMENT, PREPARED_STATEMENT, vagy CALLABLE_STATEMENT. A(z) getCurrentApplicationName() használatával azonosíthatja azt a kapcsolatot vagy készletet, amely egy eseményt előállított, a applicationName kapcsolattulajdonsága alapján. Ha applicationName nincs beállítva, a metódus visszaadja az illesztőprogram alapértelmezett alkalmazásnevét.

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

Nanomásodperces időzítés önkéntes. Azok a visszahívások, amelyek nem írják felül a useNanoseconds() elemet, továbbra is ezredmásodpercben megadott időtartamokat kapnak. Ha egy regisztrált visszahívás ezt kéri, a dedikált teljesítménynaplózó kimenete nanoszekundumot is használ, és az időtartamokat ns címkével jelöli; egyébként milliszekundumot és ms címkét használ. A hívások System.nanoTime() nagyobb terheléssel járhatnak, mint System.currentTimeMillis() bizonyos platformokon.

A visszahívás kontextus csak a megfelelő publish() invocation során érhető el. getCurrentApplicationName() kapcsolatszintű és utasításszintű eseményekhez érhető el, és null kívül publish() értéket ad vissza. Akkor is visszaadhatja a(z) null értéket, ha a kapcsolat tulajdonságait még nem elemezték fel, például amikor a kapcsolódás meghiúsul, mielőtt feloldanák az alkalmazás nevét. Az SQL-környezet metódusai null értéket adnak vissza kapcsolatszintű események, SQL-környezettel nem rendelkező utasítások altevékenységi metrikái, valamint a publish() kívülről indított hívások esetén.

Figyelmeztetés

Az SQL szöveg tartalmazhat érzékeny adatokat literálisokban vagy kommentekben. Tisztítsd meg azt, és alkalmazd a szervezeted adatkezelési követelményeit, mielőtt naplókba vagy telemetriába írnád.

2. lehetőség: Java-naplózás konfigurálása

Konfigurálja java.util.logging a teljesítménymetrika-naplózókat a FINE szinten.

Egy logging.properties fájlban:

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

Vagy programozott módon:

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

Metódushatás előkészítése utasítási tevékenységekre

A nyomon követett PreparedStatement tevékenységek a prepareMethod kapcsolati tulajdonságtól függenek. További információ: prepareMethodA kapcsolat tulajdonságainak beállítása.

prepareMethod beállítás Első végrehajtás Második végrehajtás Harmadik+ végrehajtás
prepexec (alapértelmezett) STATEMENT_EXECUTE (sp_executesql) STATEMENT_PREPEXEC (sp_prepexec) STATEMENT_EXECUTE (sp_execute)
prepare STATEMENT_PREPARE + STATEMENT_EXECUTE STATEMENT_EXECUTE STATEMENT_EXECUTE
none STATEMENT_EXECUTE (közvetlen SQL) STATEMENT_EXECUTE (közvetlen SQL) STATEMENT_EXECUTE (közvetlen SQL)

Megjegyzés:

Az alapértelmezett prepexec beállítással az illesztőprogram önálló használatot feltételezve defereli az előkészítést. A második végrehajtás (kombinált előkészítés és végrehajtás) használja sp_prepexec . A harmadik végrehajtástól kezdve a gyorsítótárazott fogópont a sp_execute segítségével újra felhasználható. Az első hívás kényszerítéséhez állítsa sp_prepexec a kapcsolati tulajdonságot enablePrepareOnFirstPreparedStatementCall a következőre: true.

Mintanapló kimenete

Az alábbi kimenet az alapértelmezett PreparedStatement beállítással három egymást követő végrehajtás prepexec során nyomon követett tevékenységeket mutatja be:

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