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
相关产品推荐
相关产品推荐

