2013-06-13 7 views
6

Ich habe einige Leistungsprobleme mit Hibernate, da es die Datenbank zu oft trifft. Ich untersuche einige Holstrategien. Ich möchte einige funktionale Einheitentests schreiben, damit sich meine Anwendung weiterentwickelt. Ich kann sehen, wie viele SQL-Anweisungen aufgerufen werden.SQL-Anweisungen in Hibernate zählen

Ich möchte wissen, ob ich zählen kann, wie viele SQL-Anweisungen aufgerufen werden. Im Moment setze ich show-sql auf true und zähle dann die SQLs in der Konsole. Ich möchte dies möglichst im Code tun. Ist es möglich zu zählen, wie viele SQLs im Ruhezustand die DB mit in Code trifft?

Dank

EDIT

Nach @Aleksander Blomskøld Antwort ....

Mein Testfall ist

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

Die Abfrage Ausführungszahl als 1 gegeben ist und wenn Ich schaue auf die Abfrage, es heißt, dass es "von MyType"

0 ist

In den SQL-Anweisungen im Protokoll kann ich jedoch sehen, dass es SQL-Anweisungen gibt, um MyType und viele zugehörige Klassen abzurufen. In der Tat möchte ich alle SQLs wissen, die die DB wegen des "von MyType" Anrufs treffen.

Was benötige ich klarer? Oder bin ich einfach zu mißbrauchen der StatisticService

Dank

+1

Ihre Datenbank wahrscheinlich bessere Möglichkeiten hat Heuristik auf diese zu bekommen, als „Zählen SQLs“. Ich denke du meinst "SQL-Anweisungen zählen" übrigens. –

+0

korrigieren @tieTYT es ist Aussagen - haben den Code aktualisiert – RNJ

+0

Vielleicht könnten Sie Nprof betrachten? –

Antwort

8

Statistiken in dem Ruhezustand aktiviert und den Statistikdienst verwenden. Stellen Sie sicher, dass Sie hibernate.generate_statistics = true festlegen, wenn Sie die Sitzungsfactory konfigurieren. Sie könnten dann entweder die Statistiken über JMX zugreifen oder programmatisch:

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

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

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

Hi @Aleksander, Ich bin nicht sicher, das ist ganz was ich will. Ich habe die Frage aktualisiert ... es ist fast da, also danke – RNJ

3

Sie könnten einige JDBC-Wrapper/Proxy versuchen es Toolkits aus.

Dieser sieht für Ihre Aufgabe vielversprechend aus: JDBC Spy.

Eigenschaften

  • log die Ausführung und die Iterationszeit aller SQL-Anweisungen
  • Aussagen identifizieren, die ausgeführt mehrfach
  • die Stack-Trace mit konfigurierbaren Tiefe für alle kotierten Aussagen sind
  • bietet Statistiken für alle Verbindungen, SQL-Anweisungen, Resultsets
  • liefert die Größe des Suchresultates
  • eine API bietet alle statistischen Informationen
  • Liste alle Aussagen, die derzeit
  • Liste alle Anweisungen ausgeführt werden, werden abgerufen, die ausgeführt wurden, haben aber nicht
  • benachrichtigt geschlossen worden (z.Bvia trace) wenn die Ausführungszeit einer Anweisung einen konfigurierbaren Schwellenwert überschreitet
  • benachrichtigt, wenn Sie vergessen haben, eine Ergebnismenge oder eine Aussage zu schließen, bevor die Verbindung geschlossen wird
  • unterstützt verschiedene Protokollierer (log4j, java logging, slf, ...)
  • erweiterbar durch individuelle Zuhörer

Aber es gibt viele mehr, wie log4dbc, jdbc-trace-wrapper usw.