sottovento
25-06-2019, 22:47
Cari colleghi
mi e' stato richiesto di dare un'occhiata ad una pagina web intranet realizzata attraverso una servlet poiche' terribilmente lenta (oltre 40 secondi per visualizzare).
La pagina ha bisogno di 6 query (indipendenti l'una dall'altra) per ottenere tutti i dati necessari.
Le query vengono effettuate in sequenza ed i tempi sono:
query 1: 14113 ms
query 2: 7764 ms
query 3: 16247 ms
query 4: 2587 ms
query 5: 9272 ms
query 6: 205 ms
Totale preparazione pagina:50188 ms
Ovviamente i tempi cambiano leggermente ad ogni esecuzione.
Visto che le query sono indipendenti, ho pensato di lanciarle tutte in esecuzione simultaneamente in 6 thread diversi.
Il thread principale dovra' quindi aspettare che tutti i 6 thread finiscano l'esecuzione per raccogliere i dati e preparare la pagina.
Cosi' ho fatto, sincronizzando ovviamente i 6 thread in modo da completare la pagina solo quando tutti 6 hanno completato il loro lavoro.
Il risultato e' stato sorprendente:
query 1: 41965 ms
query 2: 33340 ms
query 3: 48538 ms
query 4: 15127 ms
query 5: 33451 ms
query 6: 1901 ms
Totale preparazione pagina:48589 ms
In pratica, le query hanno necessitato di un tempo di esecuziona di gran lunga maggiore!
Mi sarei aspettato che il tempo di esecuzione si riducesse (grosso modo) al tempo di esecuzione della query piu' lenta. Questo risultato e' completamente inatteso!
Ho fatto anche stampare la data/ora di partenza della query, pensando ad un mio errore di programmazione (pensando che erroneamente avessi potuto far partire i thread sequenzialmente) ma tutte e 6 le query dicono di partire esattamente allo stesso orario, quindi stanno lavorando tutte insieme.
C'e' qualcuno esperto di Microsoft SQL server che ha un'idea di cosa stia accadendo?
A proposito: per quanto riguarda le connessioni, uso la gestione del pool di connessioni messa a disposizione da Tomcat (i.e. org.apache.tomcat.jdbc.pool.DataSource). Ho un singleton DataSource dal quale ottengo una connessione mediante DataSource.getConnection(), quindi suppongo che ci sia una connessione diversa per ogni thread/query. Purtroppo la documentazione e' un po' vaga e non sono sicurissimo.
Qualcuno ha un'idea?
Ciao!
mi e' stato richiesto di dare un'occhiata ad una pagina web intranet realizzata attraverso una servlet poiche' terribilmente lenta (oltre 40 secondi per visualizzare).
La pagina ha bisogno di 6 query (indipendenti l'una dall'altra) per ottenere tutti i dati necessari.
Le query vengono effettuate in sequenza ed i tempi sono:
query 1: 14113 ms
query 2: 7764 ms
query 3: 16247 ms
query 4: 2587 ms
query 5: 9272 ms
query 6: 205 ms
Totale preparazione pagina:50188 ms
Ovviamente i tempi cambiano leggermente ad ogni esecuzione.
Visto che le query sono indipendenti, ho pensato di lanciarle tutte in esecuzione simultaneamente in 6 thread diversi.
Il thread principale dovra' quindi aspettare che tutti i 6 thread finiscano l'esecuzione per raccogliere i dati e preparare la pagina.
Cosi' ho fatto, sincronizzando ovviamente i 6 thread in modo da completare la pagina solo quando tutti 6 hanno completato il loro lavoro.
Il risultato e' stato sorprendente:
query 1: 41965 ms
query 2: 33340 ms
query 3: 48538 ms
query 4: 15127 ms
query 5: 33451 ms
query 6: 1901 ms
Totale preparazione pagina:48589 ms
In pratica, le query hanno necessitato di un tempo di esecuziona di gran lunga maggiore!
Mi sarei aspettato che il tempo di esecuzione si riducesse (grosso modo) al tempo di esecuzione della query piu' lenta. Questo risultato e' completamente inatteso!
Ho fatto anche stampare la data/ora di partenza della query, pensando ad un mio errore di programmazione (pensando che erroneamente avessi potuto far partire i thread sequenzialmente) ma tutte e 6 le query dicono di partire esattamente allo stesso orario, quindi stanno lavorando tutte insieme.
C'e' qualcuno esperto di Microsoft SQL server che ha un'idea di cosa stia accadendo?
A proposito: per quanto riguarda le connessioni, uso la gestione del pool di connessioni messa a disposizione da Tomcat (i.e. org.apache.tomcat.jdbc.pool.DataSource). Ho un singleton DataSource dal quale ottengo una connessione mediante DataSource.getConnection(), quindi suppongo che ci sia una connessione diversa per ogni thread/query. Purtroppo la documentazione e' un po' vaga e non sono sicurissimo.
Qualcuno ha un'idea?
Ciao!