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?
veuillez reformater –