PDA

View Full Version : [java] pool di connessioni dbcp


prazision
01-08-2005, 18:56
dunque, ho utilizzato questa libreria

http://jakarta.apache.org/commons/dbcp/configuration.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/dbcp/configuration.html

per capire bene cosa rappresentano quei valori ma non mi è ancora chiaro.
qualcuno mi sa spiegare con precisione MAXIDLE e MINIDLE??

grazie mille

kingv
01-08-2005, 21:12
per capire bene cosa rappresentano quei valori ma non mi è ancora chiaro.
qualcuno mi sa spiegare con precisione MAXIDLE e MINIDLE??





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.

kingv
01-08-2005, 21:17
coi parametri removeAbandoned e removeAbandonedTimeout puoi dire al gestore del pool dopo quanto tempo considerare "dimenticate" le connessioni non rilasciate e se eventualmente rilasciarle.

prazision
01-08-2005, 22:02
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.


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/08/examples/context.xml.html
vanno quindi settati nel file .xml vero???

grazie e bentornato (nei miei post malefici :sofico: )

kingv
02-08-2005, 08:54
in idle che significa??? a disposizione???(nel senso che se la deve rilasciare celha a disposizione velocemente)?

grazie e bentornato (nei miei post malefici :sofico: )


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.

kingv
02-08-2005, 08:57
su removeAbandoned e removeAbandonedTimeout ho trovato questo:
http://www.onjava.com/onjava/2003/01/08/examples/context.xml.html
vanno quindi settati nel file .xml vero???


sì, la configurazione avviene nell'xml.

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.

prazision
02-08-2005, 10:05
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.

se ho un pool con 3 connessioni non dovrebbe istanziare una quarta ma mettere in coda,no???
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

prazision
02-08-2005, 10:08
sì, la configurazione avviene nell'xml.

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.

si lo so, se chiudi le connessioni le rilascia ma mi stupiva il fatto che (senza chiuderle) dopo unpo' non le rilasciasse

grazie

kingv
02-08-2005, 10:30
se ho un pool con 3 connessioni non dovrebbe istanziare una quarta ma mettere in coda,no???
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

no non mette in coda, il pool ne crea un'altra, a meno che il numero non sia già uguale al valore del parametro maxActive.
Per idle intendo inutilizzata, ovvero già istanziata ma non usata da nessuno (e quindi disponibile per un eventuale richiedente)

kingv
02-08-2005, 10:31
si lo so, se chiudi le connessioni le rilascia ma mi stupiva il fatto che (senza chiuderle) dopo unpo' non le rilasciasse

grazie


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 ;)

prazision
02-08-2005, 10:43
no non mette in coda, il pool ne crea un'altra, a meno che il numero non sia già uguale al valore del parametro maxActive.
Per idle intendo inutilizzata, ovvero già istanziata ma non usata da nessuno (e quindi disponibile per un eventuale richiedente)


ah ok pensavo che per pool con 3 connessioni intendessi un pool con maxActive=3; avevo capito male

prazision
02-08-2005, 10:46
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 ;)


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

kingv
02-08-2005, 12:06
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


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.

prazision
02-08-2005, 12:19
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.


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

kingv
02-08-2005, 14:37
ma hai aspettato 20 secondi dopo aver utilizzato le prime 10 connessioni?

kingv
02-08-2005, 14:42
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???



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 :asd: )

prazision
02-08-2005, 14:57
ma hai aspettato 20 secondi dopo aver utilizzato le prime 10 connessioni?

guarda ora ho messo

<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

kingv
02-08-2005, 15:09
guarda ora ho messo




devi mettere un po' di log per capire esattamente il problema.

c'e' una jsp di esempio sul sito, stai provando con quella?

prazision
02-08-2005, 15:11
è 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();*/
%>

kingv
02-08-2005, 15:35
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?

prazision
02-08-2005, 15:57
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?


spero daver capito la tua domanda e rispondo: uso un file di configurazione .xml che metto sotto web-inf che contiene:
<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>

e lo richiamo dalla classe che crea il pool
era questa la domanda?(non penso eh)

prazision
02-08-2005, 16:01
oh ma cmq come hai detto tu chissenefrega delle connessioni non chiuse, è un errore di programmazione.

quindi lasciam stare ;)

prazision
02-08-2005, 16:08
grazie tantissimo cmq

kingv
02-08-2005, 16:15
e lo richiamo dalla classe che crea il pool
era questa la domanda?


sì, la domanda era questa, non mi era chiaro come usi DBCP

esistono due modi:
1) direttamente, ovvero registrando org.apache.commons.dbcp.PoolingDriver come driver jdbc e chiedendo a lui gli oggetti Connection
2) utilizzando un datasource DBCP in un application server che lo supporta, come ad esempio tomcat.

di sicuro hai usato il secondo approccio, visto che la configurazione l'hai nel web.xml

kingv
02-08-2005, 16:15
grazie tantissimo cmq



niente figurati :)

prazision
02-08-2005, 16:20
sì, la domanda era questa, non mi era chiaro come usi DBCP

esistono due modi:
1) direttamente, ovvero registrando org.apache.commons.dbcp.PoolingDriver come driver jdbc e chiedendo a lui gli oggetti Connection
2) utilizzando un datasource DBCP in un application server che lo supporta, come ad esempio tomcat.

di sicuro hai usato il secondo approccio, visto che la configurazione l'hai nel web.xml


non è nel web.xml ma in un file .xml apparte

kingv
02-08-2005, 17:24
non è nel web.xml ma in un file .xml apparte


:what:

e come fa DBCP a referenziarlo?

prazision
02-08-2005, 17:25
:what:

e come fa DBCP a referenziarlo?


senti ti spedisco tutto???