ConnectionPool从servletcontext抛出nullpointer
【腾讯云】亏本大甩卖,服务器4核16G 1年370元(带宽12M,系统盘120GB SSD盘,月流量2000GB)!!!!!!
云产品 配置 价格
服务器 1核2G,带宽5M,系统盘50GB SSD盘,月流量500GB 38元/年
MySQL 1核1G 19元/年
服务器 16核32G,带宽18M,系统盘250GB SSD盘,月流量5000GB 1197元/年
点我进入腾讯云,查看更多详情

I have a problem with a ConnectionPool that gets exausted very quickly. Basically i have loaded a listener within the application, whenever the context is initialized, a Timer will start, and a timertask within it, will perform an SQL query, which uses a connection pool "the connection pool jar i copied it in Tomcat 6" The listener "only the relevant method":

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

}


}

Basically I get the null pointer at this line:

return source.getConnection();

Telling me that the database name is not found.

The problems is that it works for the first times, for 5 or 6 minutes (when I set the timer to 1000*60) the queries are sent successfully, so the database is found, meaning that the configuration in context.xml is correct.

The method that is using the connection pool from inside the overridden run method of MyTask, which extends TimerTask is:

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

}

} 

Any advice?

#0

You only free the connection in the catch-Block, but you actually need to free it everytime.
You should put it in a finally block, so that the connection is freed (and returned to the pool) after each use.

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

And you should call prep.close() in the finally to close the PreparedStatement (if pool.freeConnection(con) does not take of this itself)).

推荐文章

正确的透视高度和透视变换?

正确的透视高度和透视变换?

推荐文章

捕捉类似Facebook的onclick事件

捕捉类似Facebook的onclick事件

推荐文章

在没有画布的内联块div中的奇怪位置(参见示例)

在没有画布的内联块div中的奇怪位置(参见示例)

推荐文章

在开发和生产中为WPF应用程序使用不同的WCF服务

在开发和生产中为WPF应用程序使用不同的WCF服务

推荐文章

用户登录后显示的Django轮询

用户登录后显示的Django轮询

推荐文章

设置重力不工作

设置重力不工作

推荐文章

MacRuby:从JavaScript与Objective C通信

MacRuby:从JavaScript与Objective C通信

推荐文章

谷歌虚拟键盘作为书签

谷歌虚拟键盘作为书签

推荐文章

ASP.NetMVC-有条件的未授权重定向

ASP.NetMVC-有条件的未授权重定向

推荐文章

删除PowerShell中目录的最旧版本

删除PowerShell中目录的最旧版本

推荐文章

将PHP“分组”数组转换为“分段”数组

将PHP“分组”数组转换为“分段”数组

推荐文章

一个YML文件可以访问另一个YML文件吗?

一个YML文件可以访问另一个YML文件吗?

推荐文章

如何将自定义控件DLL导入新项目?

如何将自定义控件DLL导入新项目?

推荐文章

使用DBFactory和Oracle存储过程sys ref cusror返回数据集

使用DBFactory和Oracle存储过程sys ref cusror返回数据集

推荐文章

asp.net检查文本框中的字符串是否存在于我的访问表中

asp.net检查文本框中的字符串是否存在于我的访问表中

推荐文章

如果将现有的实体对象添加到DbContext,会发生什么情况?

如果将现有的实体对象添加到DbContext,会发生什么情况?