webForumDet fria alternativet

tomcat prestandaproblem

Java

6 svar · 582 visningar · startad av Jaar

Medlem sedan juli 2001434 inlägg
Frågan#1

Jag har en tomcat 5.5 uppsatt.
webapplikationen består utav jsp sidor som via klasser och connectionPool anropar en oracle databas som ligger på en annan maskin.
På detta ligger också ett par filter för att kolla om användaren har en session och har något språk inställt samt kontroll av lösenord på vissa sidor.

Det hela loggas även av log4j i debug läge för tillfället

Nu till problemet.
Huvuddelen av sidan ligger på en IIS på en annan maskin. Därifrån går man till skyddande sidor som ligger på tomcat maskinen. Detta anrop tar en väldigt lång tid första gången man gör det. Det rör sig om 5-10 sekunder.

Det jag har spårat det till att det TROLIGEN bara är när en ny session skapas. Det är bara då jag får det. Anrop 2,3 o 4 går utmärkt men jag har inte kört en hel session igenom.

Någon som kan hjälpa mig att gräva på rätt ställe och ge tips på troliga problem? Känns som att det kan vara connection poolen men jag tycker att den borde återanvändas på ett smartare sätt? Det går ju segare än om jag skulle ta bort den?

Medlem sedan maj 20012 237 inlägg
#2

Du kan ju alltid placera ett par System.currentTimeMillis() runt ett kodblock och sedan räkna ut hur länge det tog.

Du kan göra detta på olika ställen i hela kedjan.

Kanske får du då mer exakt info om vart problemet finns.

Medlem sedan juli 2001434 inlägg
#3

När jag kollat på detta i loggen så har jag bl.a sett att det tar några sekunder att skapa upp en connection. Frågan är varför det tar det? Det kan vara så att han lyckas stänga ned alla connection till databasen (elelr alla är upptagna) och när man skapar upp en ny så tar det extra lång tid? låter det troligt? hur kan jag sätta att ett visst antal skall vara igång jämt i så fall så att han gör detta innan de tar slut (typ "håll alltid 2 kopplingar lediga")

Medlem sedan maj 20012 237 inlägg
#4

Vad kör du med för connection pool?

Medlem sedan maj 20012 237 inlägg
#5

Att öppna en nu databas-koppling ska nog inte ta 5-10 sekunder.

Medlem sedan juli 2001434 inlägg
#6

lite kod:

Först från web.xml

	<resource-ref>
		<description>Oracle database connection</description> 
        <res-ref-name>jdbc/OracleDB</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
	</resource-ref>

Som skickas med till containern från war filen

<Context path="/Pandaforsaljningen">
  <Logger className="org.apache.catalina.logger.FileLogger" prefix="Pandaforsaljningen." suffix=".log" timestamp="true"/>
  <ResourceLink global="jdbc/OracleDB" name="jdbc/OracleDB" type="javax.sql.DataSource"/>
</Context>

I server.xml

  <!-- Global JNDI resources -->
  <GlobalNamingResources>
    <Resource 
		name="jdbc/OracleDB" 
		auth="Container" 
		type="javax.sql.DataSource"
        url="jdbc:oracle:thin:@xx.xx.xx.xx:1521:NAME"
        password="password"
        maxActive="20"
        maxWait="10000"
        driverClassName="oracle.jdbc.driver.OracleDriver"
        username="user"
        maxIdle="2"
        validationQuery="select sysdate from dual"
        accessToUnderlyingConnectionAllowed="true" />          
 </GlobalNamingResources>

Tror det är i de sista parametrarna som svaret ligger...

Medlem sedan maj 20012 237 inlägg
#7

maxIdle står väl för max antalet fria connections mot databasen.

Pröva med att höja värdet lite och testa igen.
Kolla att du inte har tomma catch-satser i koden.

Placera nån sorts log-funktion i varje catch så ser du direkt om nåt går fel.

268 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)