ConnectionPool выбрасывает нулевой указатель из servletcontext - PullRequest
0 голосов
/ 06 октября 2011

У меня проблема с ConnectionPool, который очень быстро истощается. По сути, я загрузил прослушиватель в приложении, всякий раз, когда контекст инициализируется, запускается таймер, а таймерная задача в нем выполняет SQL-запрос, который использует пул соединений «jar пула соединений, который я скопировал в Tomcat 6». Слушатель "только соответствующий метод":

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

}


}

Обычно я получаю нулевой указатель на эту строку:

return source.getConnection();

Сообщаем, что имя базы данных не найдено.

Проблема в том, что он работает в первый раз, в течение 5 или 6 минут (когда я установил таймер на 1000 * 60) запросы успешно отправляются, поэтому база данных найдена, что означает, что конфигурация в context.xml правильно.

Метод, который использует пул соединений изнутри переопределенного метода выполнения MyTask, который расширяет TimerTask:

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

}

} 

Любой совет?

1 Ответ

1 голос
/ 06 октября 2011

Вы освобождаете соединение только в блокирующем блоке, но вам действительно нужно освобождать его каждый раз.
Вы должны поместить его в блок finally, чтобы после каждого использования соединение освобождалось (и возвращалось в пул).

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

И вам следует вызвать prep.close() в finally, чтобы закрыть PreparedStatement (если pool.freeConnection(con) не принимает это сам)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...