Listener 类,继承了ServletContextListener接口
package com.example.Listener;
import com.example.Util.JDBCUtil;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.sql.Connection;
import java.util.HashMap;
import java.util.Map;
public class Listener implements ServletContextListener {
//在Tomcat启动时,预先创建20个Connection,在userDao.add方法执行时
//将实现创建好connection交给add方法
@Override
public void contextInitialized(ServletContextEvent sce) {
ServletContextListener.super.contextInitialized(sce);
JDBCUtil util = new JDBCUtil();
Map map = new HashMap();
for (int i = 0; i < 20; i++) {
Connection con = util.getCon();
System.out.println("创建"+con);
map.put(con,true);//true表示通道处于空闲状态
}
//为了在Http服务器运行期间,一直都可以使用20个Connection,
//将connection保存到全局作用域对象对象
ServletContext application = sce.getServletContext();
application.setAttribute("key",map);
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
//在Http服务器关闭时刻,将全局作用域对象20个Connection销毁
ServletContextListener.super.contextDestroyed(sce);
ServletContext application = sce.getServletContext();
Map map = (Map) application.getAttribute("key");
for (Object o : map.keySet()) {
Connection con = (Connection) o;
if (con != null) {
System.out.println("销毁" + con);
}
}
}
}
错误信息:
java.lang.NoClassDefFoundError: com/example/Util/JDBCUtil
at com.example.Listener.Listener.contextInitialized(Listener.java:19)
java.lang.NullPointerException
at com.example.Listener.Listener.contextDestroyed(Listener.java:38)
JDBCUtil类,链接数据库:
package com.example.Util;
import java.sql.*;
public class JDBCUtil {
static String driver="com.mysql.cj.jdbc.Driver";
final String url = "jdbc:mysql://localhost:3306/test";
final String userName = "root";
final String password = "123";
Connection con = null;
//将jar包中driver实现类加载到JVM中
static {
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//封装链接通道创建细节
public Connection getCon(){
try {
con = DriverManager.getConnection(url,userName,password);
} catch (SQLException e) {
e.printStackTrace();
}
return con;
}
}
static代码块里try catch是不是有问题,导致mysql的jdbc驱动没加载上,后面连接都是空的。可以换成方法试一下,最好打断点再看看。