Newsgroup: it.comp.java
Titolo: problema con connectionpool

Mi si presenta questo problema, dai log vedo un incremento di connessioni 
nella pool di connessioni anche ad ogni aggiornamento di una pagina 
generata da una servlet che prende i dati da una tabella.
Ad ogni reload una nuova connessione.
Ma la connectionpool non serve per evitare anche questi problemi?
Per il pool utilizzo il jar preso su 
www.webdoyen.com
.
E' un errore nel package o sbaglio qualcosa io?


Potresti farci vedere un po' di codice?
Ciao.
\mirko

 \mirko
ci provo
Ho una servlet che e' configarata in web.xml in modo da aprire il pool 
all'avvio di tomcat, quindi lo salvo nel contesto dell'applicazione.
------
try
        {
            cpool = new ConnectionPool( dbURL , dbUserName , dbPassword, 
dbDriver, 5, 1, 2, 1);    
 
            getServletContext().setAttribute("pool",cpool); 
 
        }
----
5 sono le connessioni aperte all'avvio, 1 l'incremento quando sono tutte 
occupate, 2 l'iteration tile per il controllo dell'integrita' delle 
connessioni, 1 il tempo di attesa per la chiusura delle connessioni in 
stato idle
a questo punto utilizzo una classe per le query nel db, si chiama 
t_generictable.
In questa la gestione delle connessioni avviene nel seguente modo:
------
 public void getPool(ConnectionPool pool) {
        _pool = pool;
        try{
 
                connection = _pool.getConnection("pool");
 
        }
        ..
        //per prendere una connessione dal pool
        public ResultSet SQLquery(String value) throws SQLException {
 
                Statement st = connection.createStatement();    
                ResultSet rs = null;
                if (debug) System.out.println(value);           
                if (value.trim().toUpperCase().startsWith("SELECT")) {
                        rs = st.executeQuery(value);
                } else {
                        st.execute(value);
                }
                _pool.returnConnection(connection);
 
                return rs;
 
        }
        //tutte i metodi per le query usano questo metodo, alla fine rilas
cio la connessione
------
questo significa che nella servlet ho ad esempio:
------
 
pool = (ConnectionPool) getServletContext().getAttribute("pool");
t_generictable table = new t_generictable();
table.getPool(pool);
 
table.SQLselect(query);
 
request.setAttribute("table",table);
RequestDispatcher rd =  
getServletContext().getRequestDispatcher("/admin/usermod.jsp");
rd.forward(request, response);
------
e nella pagina chiamata uso i metodi di t_generictable per gestire il 
resultset
sostanzialmente pero' le connessioni non vengono mai rilasciate.

 
Non ho mai usato il package che stai usando tu, ma dubito che tu possa 
continuare ad usare il ResultSet (che ritorni da SQLquery()) *dopo* aver 
liberato la connessione con _pool.returnConnection(connection).
La regola generale č:
  1. ottieni una Connection
  2. crei uno Statement
  3. ottieni un ResultSet
  4. usi il ResultSet
  5. chiudi il ResultSet
  6. chiudi lo Statement
  7. chiudi (o libero o ritorni al pool) la Connection
L'ultimo punto dovrebbe essere possibilmente dentro un blocco finally 
per assicurarsi che la connessione venga chiusa o liberata anche nel 
caso in cui capiti un'Exception.
Ciao.
\mirko

   7. chiudi (o libero o ritorni al pool) la Connection
ho fatto delle modifiche per rispettare pedissequamente la lista :-) ma non 
e' cambiato nulla, continua a non rilasciare le connessioni.
ho pure controllato il codice della returnConnection e pare funzionare (?)
nel senso che returnVal e' true.
-----
public boolean returnConnection (Connection connection)
    {
        boolean returnVal = false;
        Connection con;
        Enumeration cons = connections.keys();
        while (cons.hasMoreElements()) 
        {
            con = (Connection)cons.nextElement();
            if (con==connection) 
            {
                connections.put(con, new ConData());
                returnVal = true;
 
                break;
            }
        }
        System.out.println(returnVal);
        return  (returnVal);
    }
-----

 
Non sarà quello il problema specifico, ma in ogni caso continuare ad 
usare un ResultSet legato ad una Connection che è stata liberata 
potrebbe causartene altri, di problemi. ;-)
Per il resto, non so che dirti, mi spiace.
Ciao.
\mirko

 mirko
Scusate se forse è un pochino OT: io sto usando una classe CP ideata da un
ragazzo che ho trovato su internet, molto carina ! Ora, come posso rendere
la classe instanziata da un Context listener visibile ad un normale
JavaBean? Grazie 
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it