2013-06-13 21 views
6

Veritabanına çok fazla kez vurduğundan hazırda bekletme sorunları yaşıyorum. Bazı getirme stratejilerini araştırıyorum. Uygulamam geliştikçe, kaç tane SQL ifadesinin çağrıldığını görebilmek için bazı işlevsel birim testleri yazmak istiyorum.Hazırda bekleyen SQL deyimlerini sayın

Kaç SQL ifadesinin çağrıldığını sayabilir miyim, bilmek istiyorum. Şu anda show-sql öğesini true olarak ayarlıyorum ve ardından konsoldaki SQL'leri sayıyorum. Mümkünse bunu kod içinde yapmak istiyorum. Kodda kaç SQL'in hazırda beklediğini saymak mümkün mü?

Teşekkür

DÜZENLEME

@Aleksander Blomskøld cevapta sonra ....

Benim test durumu sorgu yürütme sayımı 1 olarak ve eğer verilir

StatisticsService statisticsService = new StatisticsService(); 
Session session = entityManager.unwrap(Session.class); 
statisticsService.setSessionFactory(session.getSessionFactory()); 
statisticsService.setStatisticsEnabled(true); 

List<MyType> r= entityManager.createQuery("from MyType", MyType.class).getResultList(); 

System.out.println(statisticsService.getQueryExecutionCount()); 
System.out.println(statisticsService.getQueries()[0]); 

olduğunu "MyType" dan

0 olduğunu söyleyen sorguya bakıyorum

Ancak günlüğündeki sql deyimlerinde, MyType'ı ve ilgili sınıflarının çoğunu almak için SQL deyimlerinin olduğunu görebiliyorum. Yani aslında "MyType" çağrısından dolayı DB'ye isabet eden tüm SQL'leri bilmek istiyorum.

Daha neye ihtiyacım var? Ya da sadece

+1

Kişisel veritabanı muhtemelen "sayma SQLs" bu iş üzerinde buluşsal yöntemlerini almak için daha iyi yollar vardır. Bence "SQL deyimlerini saymak" btw. –

+0

correct @tieTYT ifadesi - – RNJ

+0

kodunu güncellediniz Belki de NProf'u düşünebilirsiniz? –

cevap

8

hazırda istatistiklerini etkinleştirme ve istatistik hizmeti kullanmak StatisticService

Teşekkür kötüye ediyorum. Oturumunuzu yapılandırırken hibernate.generate_statistics = true değerini ayarladığınızdan emin olun. Daha sonra programlama yoluyla JMX veya üzeri istatistiklerini erişebilir ya:

//Enable statistics 
StatisticsService statisticsService = new StatisticsService(); 
statisticsService.setSessionFactory(sessionFactory); 
statisticsService.setStatisticsEnabled(true); 

// Do queries... 
//... 

///Print out stats: 
System.out.println(statisticsService.getQueryExecutionCount()); 
+0

Merhaba @Aleksander, Bunun tam olarak istediğim şey olduğundan emin değilim. Soruyu güncelledim ... neredeyse orada çok teşekkürler – RNJ

3

Bazı JDBC sarıcı/vekil orada araci deneyebilirsiniz.

Bu, göreviniz için umut vaat ediyor: JDBC Spy.

Özellikleri

  • günlük yürütme ve
  • idam birden çok kez
  • tüm listelenen tablolara
  • için yapılandırılabilir derinliği yığın izleme olan ifadeleri aynen tüm SQL tabloların yineleme zamanı
  • tüm bağlantıların istatistiklerini, SQL deyimlerini, sonuçları gösterir
  • Resultset
  • büyüklüğü tüm istatistiki bilgileri şu anda
  • listesi yürütülmekte tüm ifadeler
  • listesini almak için bir API sağlar sağlar idam edilmiş, ancak
  • bildirebilmesi kapatılmamış olan tüm ifadeler (ÖrneğinBağlantı
  • kapatılmadan önce bir ifadenin çalıştırılması zaman bir resultset kapatmayı unuttuysanız
  • bildirir yapılandırılabilir bir eşiği veya bir açıklama aşarsa) iz üzerinden farklı kaydedicileri (log4j, java günlüğü, SLF destekler, ...) özel dinleyicileri

tarafından uzatılabilir

  • Ama orada, daha birçok log4dbc, jdbc-trace-wrapper gibi vb

  • İlgili konular