JaarMedlem sedan juli 2001434 inlägg
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?
jmeMedlem sedan maj 20011 967 inlägg
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.
JaarMedlem sedan juli 2001434 inlägg
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")
jmeMedlem sedan maj 20011 967 inlägg
Vad kör du med för connection pool?
jmeMedlem sedan maj 20011 967 inlägg
Att öppna en nu databas-koppling ska nog inte ta 5-10 sekunder.
JaarMedlem sedan juli 2001434 inlägg
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...
jmeMedlem sedan maj 20011 967 inlägg
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.