JSF Performance - zu viele Methodenaufrufe, woher kommen sie

Status
Nicht offen für weitere Antworten.

Nicnac

Mitglied
Hallo,

ich beschäftige mich schon eine Weile mit JSF und ich versuche zu verstehen woher die Performanceprobleme kommen die ich habe.
Dabei habe ich herausgefunden, daß einige Methoden viel öfter als benötigt aufgerufen werden.

Ein Beispiel:
Ich habe eine Startseite des "Assistenten" die nur menüpunkte enthält, die aufgrund verschiedener Kriterien gerendert werden sollen oder nicht.

Es gibt zwei Menüpunkte die nur gerendert werden soll wenn ein "Testpool" nicht leer ist, der Code ist ungefähr so:

Code:
<h:panelGroup rendered="#{!bean.assistantTestPoolEmpty}">
      <h:commandLink .../>		 	 
<h:panelGroup/>

Die Methode isAssistantTestPoolEmpty() in der Bean wird aber !10! Mal aufgerufen. Ich benutze diese Methode nur als rendered-Kriterium in der jsp-Datei, sonst nirgendwo.

Weiß jemand, warum die Methode 5 mal so oft aufgerufen wird?
Was macht JSF da?

Vielen Dank für jede Hilfe, ich bin ziemlich am Verzweifeln, da das ja bei weitem nicht die einzigste Stelle ist!

Viele Grüße
N. Schweighardt
 

Nicnac

Mitglied
Hallo,

ich habe das Ganze schon im Debugger schon verfolgt, deswegen ist es mir ja so unerklärlich.
Die einzigen beiden Aufrufe im Code sind die in den rendered-Attributen, also 2. Setze ich jetzt einen Breakpoint
in die Methode wird sie 10 Mal aufgerufen.

Vielleicht wird die Seite mehrmals geladen? Das würde es erklären. Aber warum wird die Seite mehrmals geladen?

Grüße
Nicnac
 
S

SlaterB

Gast
hast du eine Art Log?
dann versuche mal
Code:
<% System.out.println(" vor  panelGroup"); %>
 <h:panelGroup rendered="#{!bean.assistantTestPoolEmpty}">
      <h:commandLink .../>          
<h:panelGroup/>  
<% System.out.println("nach panelGroup"); %>
oder ähnlich um die Anzahl der Seitenaufrufe zu bestimmen,

in der get-operation könntest du noch eine Ausgabe des StackTraces einbauen, zum Beispiel mit

Code:
System.out.println("Quelle des Aufrufs: "+getQuellen(10));

	public static String getQuelle(int tiefe) {
		String s = "";
		StackTraceElement[] sT = new Error().getStackTrace();
		
		if (sT.length <= tiefe) {
			return "-";
		} 
		
		StackTraceElement sE = sT[tiefe];

		s = sE.getClassName();
		s += "."+sE.getMethodName();
		s+=" "+sE.getLineNumber();
		return s;
	}

	public static String getQuellen(int tiefeMax) {
		String s = "";
		String line = null;
		for (int i=1; i<tiefeMax; i++) {
			line = getQuelle(i);
			if (line.length()<2) {
				break;
			} 
			s+=line+"\n";
		}
		return s;
	}
wenn du das mit den ersten Ausgaben zusammen machst:
finden alle 'Quelle des Aufrufs:'-Ausgaben zwischen 'vor panelGroup' und 'nach panelGroup' statt?
 

Nicnac

Mitglied
Hi,

danke schonmal, ich probiere das am Montag auf der Arbeit aus!

Melde mich dann.

Schönes WE,
Nicnac
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben