gpt4 book ai didi

java - ConnectionPool 从 servletcontext 抛出空指针

转载 作者:行者123 更新时间:2023-12-01 15:43:07 25 4
gpt4 key购买 nike

我遇到一个连接池问题,它很快就会耗尽。基本上我已经在应用程序中加载了一个监听器,每当初始化上下文时,计时器就会启动,其中的计时器任务将执行 SQL 查询,该查询使用连接池“我在 Tomcat 6 中复制的连接池 jar”监听器“仅相关方法”:

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 的重写 run 方法内部使用连接池的方法(扩展了 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);

}

}

有什么建议吗?

最佳答案

您只释放了 catch-Block 中的连接,但实际上每次都需要释放它。
您应该将其放在finally block 中,以便在每次使用后释放连接(并返回到池中)。

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

并且您应该在finally中调用prep.close()来关闭PreparedStatement(如果pool.freeConnection(con)本身不执行此操作))。

关于java - ConnectionPool 从 servletcontext 抛出空指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7672180/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com