You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Servlet调用DAO连接MySQL在Tomcat中失败,普通类运行正常求助

问题:Tomcat环境中Servlet调用DAO连接MySQL失败,普通Java类测试正常

代码片段

Servlet控制器(Tomcat中运行失败)

public class ProductController extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public ProductController() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    ProductDAO productDAO = new ProductDAO();
    RequestDispatcher dispatcher = null;
    String accion = request.getParameter("accion");
    
    if(accion == null || accion.isEmpty()) {
        dispatcher = request.getRequestDispatcher("products/index.jsp");
        List<Product> list = productDAO.getList();
        request.setAttribute("list", list);
    }
    dispatcher.forward(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doGet(request, response);
    }
}

DAO类

public class ProductDAO {
    public ProductDAO() {
    }

    public List<Product> getList() {
    Connection_ jdbc = new Connection();
    PreparedStatement ps;
    ResultSet rs;
    List<Product> list = new ArrayList<>();
    
    try {
            ps = jdbc.getConecction().prepareStatement("SELECT * FROM products");
            rs = ps.executeQuery();
            while(rs.next()) {
        list.add(new Product(rs.getInt("id"), rs.getInt("stock"), rs.getDouble("price"), rs.getString("name"), rs.getString("code")));
            }
            return list;
    }catch (Exception e) {
            System.out.println("Fallo en la conexion");
            return null; 
    }
    }
}

测试用普通Java类(连接正常)

public class Controller{

    public static void main(String[] args) {
    Connection_ jdbc = new Connection();
    Statement statement;
    ResultSet rows;
    try {
            statement = jdbc.getConecction().createStatement();
            rows = statement.executeQuery("SELECT * FROM products");
            System.out.println("Registers");
            while(rows.next()) {
                System.out.println("Id "+rows.getInt("stock"));
            }
    } catch (Exception e) {
            System.out.println("Fallo en la conexion");
    }
}

排查与解决方案

1. 确认MySQL驱动包的部署位置

普通Java类测试时,驱动包可能仅在项目编译路径中,但Tomcat运行Web应用时,驱动包必须放在Web项目的WEB-INF/lib目录或Tomcat全局的lib目录下。如果驱动包不在Web应用的运行类路径内,Tomcat会因找不到驱动类导致连接失败。

2. 检查数据库连接配置的一致性

查看Connection_类中的连接参数(URL、用户名、密码、驱动类名):

  • 确认普通Java类和Web项目是否读取了相同的配置文件,避免因配置路径差异导致参数不一致。
  • 排查是否存在环境变量、系统属性覆盖连接参数的情况。

3. 打印完整异常堆栈信息

当前代码仅提示连接失败,无具体异常详情,无法精准定位问题。修改DAO类的catch块,打印完整堆栈:

catch (Exception e) {
    e.printStackTrace();
    System.out.println("Fallo en la conexion");
    return null; 
}

查看Tomcat的logs/catalina.out或IDE控制台输出,根据具体异常(如ClassNotFoundException、SQLException)针对性解决。

4. 检查数据库资源的关闭逻辑

如果Web请求未正确关闭数据库连接,可能导致连接池耗尽。补充资源关闭的finally块:

public List<Product> getList() {
    Connection_ jdbc = new Connection();
    PreparedStatement ps = null;
    ResultSet rs = null;
    List<Product> list = new ArrayList<>();
    
    try {
        Connection conn = jdbc.getConecction();
        ps = conn.prepareStatement("SELECT * FROM products");
        rs = ps.executeQuery();
        while(rs.next()) {
            list.add(new Product(rs.getInt("id"), rs.getInt("stock"), rs.getDouble("price"), rs.getString("name"), rs.getString("code")));
        }
        return list;
    }catch (Exception e) {
        e.printStackTrace();
        System.out.println("Fallo en la conexion");
        return null; 
    } finally {
        try { if(rs != null) rs.close(); } catch(Exception e) {}
        try { if(ps != null) ps.close(); } catch(Exception e) {}
        try { if(jdbc.getConecction() != null) jdbc.getConecction().close(); } catch(Exception e) {}
    }
}

5. 验证MySQL用户的连接权限

普通Java类通常使用localhost连接,而Tomcat可能以服务器IP访问MySQL。确认数据库用户拥有user@%或user[Tomcat主机IP]的连接权限,避免因IP限制导致连接被拒绝。

6. 排查Tomcat安全策略限制

Tomcat的安全管理器可能限制Web应用的数据库访问权限。可临时修改catalina.sh/catalina.bat,移除-security参数关闭安全管理器,测试是否能正常连接。


内容的提问来源于stack exchange,提问作者Minor Campos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 06:45:45