2011-10-06 3 views
0

J'ai un problème avec un ConnectionPool qui s'excite très rapidement. Fondamentalement, j'ai chargé un écouteur dans l'application, chaque fois que le contexte est initialisé, un minuteur démarre, et un masque temporel dedans, va effectuer une requête SQL, qui utilise un pool de connexion "le pot de connexion". "l'auditeur « que la méthode pertinente »:ConnectionPool renvoie nullpointer à partir du servletcontext

private MyTask task=new MyTask(); 

public void contextInitialized(ServletContextEvent event) { 


this.ctx=event.getServletContext(); 


Timer timer= new Timer(); 


Calendar calendar=Calendar.getInstance(); 


Date firstTime=calendar.getTime(); 


timer.scheduleAtFixedRate(task, firstTime, 1000*60); 


ctx.setAttribute("timer",timer); 


} 

The connection pool: 



public class ConnectionPool { 


private static ConnectionPool pool=null; 


private static DataSource source=null; 


/** 

* Private constructor 

* Private omdat dit klasse een singleton-patroon volgd, dus nooit meer dan een instantie is toegestaan. 

*/ 

private ConnectionPool(){ 


try{ 


InitialContext ini=new InitialContext(); 


source=(DataSource)ini.lookup("java:/comp/env/jdbc/verkocht"); 


}catch(Exception e){ 


System.out.println("Verkocht db not found");//bedoelt voor test 

e.printStackTrace(); 

} 

} 


/** 

* Singleton getInstance() methode 

* @return the connection pool 

*/ 

public static ConnectionPool getInstance(){ 


if(pool==null){ 


pool=new ConnectionPool(); 

} 


return pool; 

} 


/** 

* Deze methode returneert een Connection instantie uit het pool 

* @return the Connection 

*/ 

public Connection getConnection(){ 


try{ 


return source.getConnection(); 


}catch(SQLException e){ 


System.out.println("No connection estabilished"); 

e.printStackTrace(); 

return null; 

} 


} 

/** 

* Sluid deze Connection object 

* @param Een connection instantie 

*/ 

public void freeConnection(Connection c){ 


try{ 


c.close(); 

} catch(SQLException e){ 


e.printStackTrace(); 

} 

} 


public static void main(String[] args){ 


ConnectionPool con=ConnectionPool.getInstance(); 


con.getConnection(); 

} 


} 

Fondamentalement, je reçois le pointeur nULL à cette ligne:

return source.getConnection(); 

me dit que le nom de la base de données est introuvable. Le problème est que cela fonctionne pour la première fois, pendant 5 ou 6 minutes (lorsque j'ai réglé le timer à 1000 * 60) les requêtes sont envoyées avec succès, donc la base de données est trouvée, ce qui signifie que la configuration en contexte. xml est correct.

La méthode qui utilise le pool de connexion à l'intérieur de la méthode d'exécution surchargée de MyTask, qui étend TimerTask est:

public void assign(int toegewezenAan, double verkoopPrijs, double totaalAfgetrokken, int artikelId){ 

String sqlUpdate="UPDATE artikelen SET toegewezenAan=?, verkoopPrijs=?, totaalAfgetrokken=?, status=? WHERE artikelId=?"; 

ConnectionPool pool=ConnectionPool.getInstance(); 

Connection con=pool.getConnection(); 

PreparedStatement prep=null; 

try{ 


prep=con.prepareStatement(sqlUpdate); 

prep.setInt(1,toegewezenAan); 

prep.setDouble(2, verkoopPrijs); 

prep.setDouble(3,totaalAfgetrokken); 

prep.setString(4, "VERKOCHT"); 

prep.setInt(5, artikelId); 

prep.executeUpdate(); 


} catch(SQLException e){ 

e.printStackTrace(); 

pool.freeConnection(con); 

} 

} 

Un conseil?

+0

veuillez reformater –

Répondre

1

Vous libérez uniquement la connexion dans le catch-Block, mais vous devez réellement le libérer à chaque fois.
Vous devez le placer dans un bloc finally, afin que la connexion soit libérée (et renvoyée au pool) après chaque utilisation.

ConnectionPool pool=ConnectionPool.getInstance(); 

Connection con=pool.getConnection(); 

PreparedStatement prep=null; 
try{ 

    prep=con.prepareStatement(sqlUpdate); 

    prep.setInt(1,toegewezenAan); 

    prep.setDouble(2, verkoopPrijs); 

    prep.setDouble(3,totaalAfgetrokken); 

    prep.setString(4, "VERKOCHT"); 

    prep.setInt(5, artikelId); 

    prep.executeUpdate(); 

} catch(SQLException e){ 

    e.printStackTrace(); 
} finally 
{ 

    pool.freeConnection(con); 
} 

Et vous devez appeler prep.close() en enfin à fermer la PreparedStatement (si pool.freeConnection(con) ne prend pas de ce lui-même)).

+0

ouch, thx! va essayer immédiatement – JBoy

Questions connexes