Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
JDBC sürücüsünü indirin
13.4 sürümünden başlayarak SQL Server için Microsoft JDBC Sürücüsü, kritik sürücü işlemlerinin zamanlamasını izlemeye yönelik bir performans ölçümleri çerçevesi sağlar. Bağlantı ve deyim yürütme davranışını gözlemlemek ve analiz etmek için bu çerçeveyi kullanabilir ve uygulamanızın SQL Server ile etkileşimlerindeki gecikme sorunlarını belirlemenize yardımcı olabilirsiniz.
Ölçümler, bağımsız olarak veya birlikte kullanılabilecek iki mekanizmayla kullanılabilir:
-
Programlı geri çağırma - Uygulama kodunuzdaki ölçümleri almak için bir
PerformanceLogCallbackkaydedin. -
Java günlüğü - Günlük çıkışındaki ölçümleri yakalamak için ayrılmış
java.util.logginggünlükçülere abone olun.
İzlenen etkinlikler
Sürücü, etkinlikleri iki düzeyde izler: bağlantı ve komut.
Bağlantı düzeyi etkinlikleri
| Activity | Açıklama |
|---|---|
CONNECTION |
Tüm alt etkinlikler dahil olmak üzere bağlantı kurulması için toplam süre. |
PRELOGIN |
Sunucuyla TDS ön oturum açma anlaşması zamanı. |
LOGIN |
TDS oturum açma ve kimlik doğrulama el sıkışma zamanı. |
TOKEN_ACQUISITION |
Microsoft Entra kimlik doğrulamasını kullanırken federe kimlik doğrulama belirteçlerini alma süresi. |
İfade düzeyinde etkinlikler
| Activity | Açıklama |
|---|---|
STATEMENT_REQUEST_BUILD |
TDS isteğini derlemek için istemci tarafı süresi (parametre bağlama, SQL işleme, paket oluşturma). Yalnızca zamanlama; özel durumları izlemez. |
STATEMENT_FIRST_SERVER_RESPONSE |
İsteği göndermeden ilk sunucu yanıtını almaya kadar geçen süre. Yalnızca zamanlama; özel durumları izlemez. |
STATEMENT_PREPARE |
sp_prepare zamanı prepareMethod=prepare olduğunda. |
STATEMENT_PREPEXEC |
sp_prepexec aracılığıyla hazırlığı ve yürütmeyi birleştirme zamanı. |
STATEMENT_EXECUTE |
Deyim yürütme süresi (sp_executesql, sp_execute, doğrudan SQL ya da toplu iş). |
Performans ölçümlerini etkinleştirme
1. Seçenek: Geri çağırma kaydı
Program aracılığıyla performans verilerini almak için bir PerformanceLogCallback kaydedin:
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);
}
});
Nanosaniye zamanlaması ve ifade bağlamını kullanın
13.6 sürümünden itibaren, bir geri çağırım, useNanoseconds() öğesini geçersiz kılarak nanosaniye zamanlamasını isteğe bağlı olarak etkinleştirebilir. Geri çağırım, uygulama tarafından gönderilen SQL metni ile yürütülen deyim türüyle bir deyim düzeyindeki olayı ilişkilendirmek için getCurrentUserSql() ve getCurrentStatementType() öğelerini de çağırabilir.
getCurrentStatementType(), CALLABLE_STATEMENT, STATEMENT veya PREPARED_STATEMENT döner. Bir olayın hangi bağlantı veya havuz tarafından üretildiğini, getCurrentApplicationName() bağlantı özelliğinden belirlemek için applicationName kullanın. Eğer applicationName ayarlanmadıysa, yöntem sürücünün varsayılan uygulama adını döndürür.
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);
}
});
Nanosaniye zamanlama ise isteğe bağlıdır.
useNanoseconds() öğesini ezmeyen geri çağrılar, süreleri milisaniye cinsinden almaya devam eder. Kayıtlı bir geri çağırım bunu etkinleştirdiğinde, özel performans günlüğü çıktısı da nanosaniye kullanır ve süreleri ns ile etiketler; aksi takdirde milisaniye kullanır ve ms ile etiketler.
System.nanoTime() çağrısı, bazı platformlarda System.currentTimeMillis() çağrısından daha fazla ek yük oluşturabilir.
Geri çağırma bağlamı yalnızca ilgili publish() çağrı sırasında kullanılabilir.
getCurrentApplicationName(), bağlantı düzeyi ve deyim düzeyi olayları için kullanılabilir ve null dışında publish() döndürür. Ayrıca null , bağlantı özellikleri ayrıştırılmadığında da geri dönebilir, örneğin bir bağlantı uygulama adı çözülmeden önce başarısız olduğunda. SQL bağlam yöntemleri, bağlantı düzeyindeki olaylar, SQL bağlamı olmayan ifade alt etkinlik metrikleri ve null dışında yapılan çağrılar için publish() döndürür.
Caution
SQL metni, literal veya yorum şeklinde hassas veriler içerebilir. Onu temizleyin ve loglara veya telemetriye yazmadan önce kuruluşunuzun veri işleme gereksinimlerini uygulayın.
Seçenek 2: Java günlüğünü yapılandırma
Performans metrik günlükçülerini java.util.logging düzeyinde FINE için yapılandırın.
Bir logging.properties dosyasında:
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
Veya program aracılığıyla:
Logger.getLogger("com.microsoft.sqlserver.jdbc.PerformanceMetrics.Connection")
.setLevel(Level.FINE);
Logger.getLogger("com.microsoft.sqlserver.jdbc.PerformanceMetrics.Statement")
.setLevel(Level.FINE);
Beyan ifadeleri üzerinde yöntemin etkisinin hazırlanması
PreparedStatement için izlenen etkinlikler, prepareMethod bağlantı özelliğine bağlıdır. hakkında prepareMethoddaha fazla bilgi için bkz . Bağlantı özelliklerini ayarlama.
prepareMethod ayar |
İlk çalıştırma | İkinci çalıştırma | Üçüncü işlem |
|---|---|---|---|
prepexec (varsayılan) |
STATEMENT_EXECUTE (sp_executesql) |
STATEMENT_PREPEXEC (sp_prepexec) |
STATEMENT_EXECUTE (sp_execute) |
prepare |
STATEMENT_PREPARE + STATEMENT_EXECUTE |
STATEMENT_EXECUTE |
STATEMENT_EXECUTE |
none |
STATEMENT_EXECUTE (doğrudan SQL) |
STATEMENT_EXECUTE (doğrudan SQL) |
STATEMENT_EXECUTE (doğrudan SQL) |
Uyarı
Varsayılan prepexec ayar ile sürücü, tek kullanım varsayılarak hazırlığı önler. İkinci çalıştırma, sp_prepexec (birleştirilmiş hazırlama ve yürütme) kullanır. Üçüncü yürütmeden itibaren, sp_execute aracılığıyla önbelleğe alınan tanıtıcı yeniden kullanılır. İlk çağrıyı zorlamak sp_prepexec için bağlantı özelliğini enablePrepareOnFirstPreparedStatementCall olarak trueayarlayın.
Örnek günlük çıktısı
Aşağıdaki çıktıda, varsayılan PreparedStatement ayara sahip bir prepexec öğesinin ardışık üç yürütmesinde izlenen etkinlikler gösterilir:
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