|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Dec 2003
Messaggi: 458
|
[java] pool di connessioni dbcp
dunque, ho utilizzato questa libreria
http://jakarta.apache.org/commons/db...iguration.html per creare un pool di connessioni ad oracle. sembra funzionare ma ci sono 2 cose che non mi tornano 1: qualora una connessione del pool non venga chiusa da codice (col metodo close) questa connessione non viene rilasciata e rimane quindi occupata(nel senso non ho aspettato 10 ore ma cmq perunpo' rimane occupata e non so fino a quando). è normale??? si puo' ovviare in qualche maniera??? 2:nel file .xml di configurazione ci sono 2 valori (oltre a <MAXACTIVE> che rappresenta il numero massimo di connessioni allocate dal pool in contempranea) <MAXIDLE>Numero</MAXIDLE> <MINIDLE>Numero</MINIDLE> da impostare ho guardato qui http://jakarta.apache.org/commons/db...iguration.html per capire bene cosa rappresentano quei valori ma non mi è ancora chiaro. qualcuno mi sa spiegare con precisione MAXIDLE e MINIDLE?? grazie mille |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
Quote:
se N°connessioni in idle >MAXIDLE le distrugge fino a raggiungere MAXIDLE se N°connessioni in idle < MINIDLE nel crea di nuove. nel primo caso vuoi liberare un po' di risorse inutilizzate, nel secondo vuoi consumarle anche quando non sarebbero strettamente necessarie per avere una potenziale connessione in più da renedere disponibile più velocemente. |
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
coi parametri removeAbandoned e removeAbandonedTimeout puoi dire al gestore del pool dopo quanto tempo considerare "dimenticate" le connessioni non rilasciate e se eventualmente rilasciarle.
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Dec 2003
Messaggi: 458
|
Quote:
in idle che significa??? a disposizione???(nel senso che se la deve rilasciare celha a disposizione velocemente)? su removeAbandoned e removeAbandonedTimeout ho trovato questo: http://www.onjava.com/onjava/2003/01...ntext.xml.html vanno quindi settati nel file .xml vero??? grazie e bentornato (nei miei post malefici |
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
Quote:
in idle significa non utilizzate e quindi a disposizione. mettiamo che tu abbia un pool di tre connessioni, di cui due utilizzate. Nel momento in cui ne viene chiesta una terza il tuo gestore la fornisce molto velocemente, ma se ci fosse la necessità di una quarta dovrebbe istanziarla (e questo per una connessione a database di solito vuol dire fare anche l'autenticazione, ci possono volere anche secondi) perdendo quindi tempo. Mettendo un MINIDLE più alto invece ne avresti avute altre da fornire subito e velocemente. Il lato negativo è che ogni connessione occupa risorse, lato client e soprattutto lato server per cui se esageri sprechi risorse e basta, per cui esiste l'altro parametro che fa rilasciare le connessioni libere al pool se sono troppe. Il settaggio di questi due parametri dipende dall'applicazione naturalmente, nel dubbio lascia quelli di default. |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
Quote:
Stai attento con quei parametri, il fatto che dopo un certo timeout lui consideri abbandonata la connessione è nella maggior parte dei casi un comportamento scorretto, se a un'applicazione non fai richieste è logico che le connessioni rimangano inutilizzate, solo che se vengono droppate dal pool nel momento in cui cerchi di utilizzarle ti becchi un'eccezione. Diciamo che nel 99% dei casi se scrivi codice corretto, rilasciando le connessioni al pool, non ti servono. |
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Dec 2003
Messaggi: 458
|
Quote:
cmq la differenza tra connessione idle e connessione non idle è che la prima è a disposizione immediatamente mentre l'altra deve essere istanziaat ecc., giusto??? grazie |
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Dec 2003
Messaggi: 458
|
Quote:
grazie |
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
Quote:
Per idle intendo inutilizzata, ovvero già istanziata ma non usata da nessuno (e quindi disponibile per un eventuale richiedente) |
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
Quote:
se lo facesse rischi che ad esempio una webapplication funzioni tutto il giorno, poi di notte dato che non viene usata da nessun le connessioni vengano resettate e la mattina dopo non funziona nulla |
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Dec 2003
Messaggi: 458
|
Quote:
ah ok pensavo che per pool con 3 connessioni intendessi un pool con maxActive=3; avevo capito male |
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Dec 2003
Messaggi: 458
|
Quote:
non capisco scusa. io apro la connessione, faccio una select e dopo non la chiudo. pensavo che dopo un tot in automatico quella connessione venisse rilasciata. perchè la mattina non dovrebbe funzionare nulla?? grazie |
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
Quote:
perchè se il pool te la rilascia sotto il naso per inattività tu pensi ancora di averla, quando arriva una nuova richiesta fai una select e ti arriva un errore. E' vero che puoi gestire l'errore e rinnovare la connessione, ma la maniera giusta quando hai un pool è di prendere e rilasciare appena hai utilizzato, tanto le operazioni di ottenimento e rilascio dal pool sono leggere dato che le connessioni al db sono preesistenti. |
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Dec 2003
Messaggi: 458
|
Quote:
dunque quel che dici tu è vero se uno ha una pagina jsp (ad esempio) che fa una select e dopo 5 minuti fa un'altra select (se in quei 5 minuti il pool te la rilascia sotto il naso rrimani fregato) ma se tu fai una select e basta in una pagina e poi dimetichi di scrivere il codice che chiude la connessione(so che è un esempio del cavolo) la cosa puo' tornare utile, no??? in ogni caso ho provato a configurare cosi il mio x.xml sotto web-inf <?xml version="1.0" encoding="UTF-8"?> <DB type="ORACLEDB"> <URL>....</URL> <PSWD>a</PSWD> <USER>a</USER> <POOL> <DRIVERNAME>DBCPPoolDrv</DRIVERNAME> <MAXACTIVE>30</MAXACTIVE> <MAXIDLE>20</MAXIDLE> <MINIDLE>10</MINIDLE> <MAXWAIT>-1</MAXWAIT> <REMOVEABANDONED>TRUE</REMOVEABANDONED> <REMOVEABANDONEDTIMEOUT>20</REMOVEABANDONEDTIMEOUT> <WHENEXHAUSTED>1</WHENEXHAUSTED> <EVICTORDELAY>300000</EVICTORDELAY> </POOL> </DB> poi ho lanciato 40 volte(da script) una pagina che usa le connessioni del pool ma non le chiude. ecco le prime 30 volte la pagina viene eseguita ma le altre 10 si blocca perchè le connessioni non vengono rilasciate nonostante :<REMOVEABANDONED>TRUE</REMOVEABANDONED> sai come mai(forse non ho capito nulla dell'uso di REMOVEABANDONED)??? grazie Ultima modifica di prazision : 02-08-2005 alle 15:57. |
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
ma hai aspettato 20 secondi dopo aver utilizzato le prime 10 connessioni?
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
Quote:
a mio parere no, è un baco e come tale andrebbe corretto. al massimo puo' essere utile l'opzione di logging delle connessioni abbandonate che ti permette di identificare i casi in cui non vengono rilasciate, ma puoi farlo anche con un po' di "code inspection" ( <- sta parolona la usava un tizio con cui lavoravo che dato che non sapeva scrivere codice guardava quello degli altri )
|
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Dec 2003
Messaggi: 458
|
Quote:
<MAXACTIVE>3</MAXACTIVE> <REMOVEABANDONED>TRUE</REMOVEABANDONED> <REMOVEABANDONEDTIMEOUT>1</REMOVEABANDONEDTIMEOUT> ho lanciato la pagina(dove la connessione non viene chiusa) da 3 browser , ho aspettato venissero eseguite, ho aspettato 30 secondi e poi ho rilanciato la pagina da unaltro browser che pero' rimane come sospesa, non viene mai eseguita come se non riuscisse a prendere la connessione(almeno penso) cmq grazie dell'aiuto |
|
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
Quote:
devi mettere un po' di log per capire esattamente il problema. c'e' una jsp di esempio sul sito, stai provando con quella? |
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Dec 2003
Messaggi: 458
|
è piu'omeno fatta così
<% String realPath = application.getRealPath("/"); ORACLEDBDAOFactory oracle_daoFactory=(ORACLEDBDAOFactory)DAOFactory.getDAOFactory(realPath); Connection connOracle1=oracle_daoFactory.getConnection(); String str_sql = "SELECT * FROM A"; String str_sql2 = "SELECT * FROM A2"; Statement stmt=connOracle1.createStatement(); ResultSet rs = stmt.executeQuery(str_sql); for(int y=0;y<12000;y++){ stmt.executeQuery(str_sql2); } rs = stmt.executeQuery(str_sql); out.println("terminato***"); PARTE COMMENTATA /* rs.close(); stmt.close(); connOracle1.close();*/ %> |
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
dovrei fare un piccolo prototipo per verificare il tutto.
Ma tu non stai usando DBCP directtamente, hai creato il datasource in tomcat definendolo come DBCP DataSource? |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 15:42.











)








