web项目查询数据库之后导致项目卡死

记录我的一次现场部署项目出现的项目卡死问题,如对您无帮助,请勿喷,谢谢。

前言

这两天在现场帮忙部署项目,部署启动之后走不了几步项目就崩了,直接卡死,不管是用 swagger 调用接口还是用前端页面调用接口,开始都是没有问题的,但是多调用几次就会出现一直 pending ,并且调用其他接口也进不到后台。

环境

Jboss 4.2.2 + JDK 7 + Maven 3.3.9 + Oracle 19 c

分析

这次刚好公司有新电脑,所以出差拿了部新的笔记本,所有的运行环境都是重新临时新搭的,给现场的 war 包也是新从笔记本进行打包的,发现了这个问题。于是用 idea 将项目跑起来,本地测试发现有相同的问题。

问题

断点测试的时候他会调用一个静态方法,然后查询数据库,然后 return 一个值,当 return 的值为 null 的时候,多调用几次就会出现项目的卡死/崩溃,现象就是打断点是走到了 return result 那步时 return 不出来,大致代码如下。

public class demoClass{
    public static void main(String[] args){
        String param1 = "xxx";
        Long param2 = 22l;
        System.out.println("开始获取returnVal结束");
        String returnVal = MyClass.getReturnVal(param1,param2);
        System.out.println("获取returnVal结束");
    }
}

class MyClass{
    public static String getReturnVal(String param1,Long param2){
        String result = dao.findMyVal(String param1,Long param2);    //这句请假象为查询数据库的操作
        return result;
    }
}

[一脸懵逼...] return 不出来也太奇葩了吧,说出来没遇到这个问题估计我这辈子都不会相信这种事会发生。。。联想到之前我在这个项目的老页面遇到的一个问题一样,就是 Jsp 里面调用java代码的时候基本数据类型 long 的参数不能自动装箱为 Long 类型,第一反应当然就是编译环境不对啦,立即所有相关的编译环境的 JDK 7 改成 JDK 6 进行编译。

更奇葩的时候也发生了,开始调用和之前一样,能正常返回,多调用几次就会死活进不去 MyClass.getReturnVal(String,Long); 这个方法,是不是很匪夷所思,在idea里面的现象就是,鼠标放在参数 param1 或者 param2 上面的时候会一直显示e什么开头的一个单词,感觉就是参数的值和类型没加载出来导致进不去的!脑壳痛。。。中间也请教了同事和同学,有说环境问题的,有说是数据库事务管理问题的,但是都没能解决了。

解决的期间有多抓狂,估计要是您遇到了,你就能明白了。。。期间也调大过内存,当然是没用的啦。。。也换过 web 容器,当然也是没用的啦。。。

中途查询过 【为什么java return 不出来值】、【web 项目进不去静态方法】、【idea 参数e....】。。。能想到的我都百度了,环境问题找不到方案了,只能从同事说的数据库事务管理方面进行着手了,当时同事要我取 oracle 安装目录下的一个 jar 包,但是这个玩意取不到的,因为现场的环境是远程不到部数据库的机器的,所以就放弃了。。。

后来又写了很多 demo 测试,我们之前那个是调用的 hibernate 的 findBy 进行查询的,1、改成 sql 查询(失败!);2、不去调用方法,直接进行查询(失败!);3、调用方法,但是不查数据库(成功!);于是断定肯定是数据库查询出的毛病,确定了一个方向之后又查了一些相关的问题,如【java 项目查询数据库之后导致项目卡死/崩溃】这类的问题,网上仍没有能解决我这个问题的

后来突发灵感,把数据库连接方式由 JDBC 改成了JNDI 连接,发现问题解决,具体原因我再查询下相关的资料,如果有结果我会在最近一周做补充,如果没的话就当此贴完结,谢谢大家听我发了半天牢骚。希望里面的内容能对您有帮助!

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在web项目中连接数据库,需要先选择合适的数据库管理系统,如MySQL、Oracle、MongoDB等。然后在项目中使用对应的驱动程序(如jdbc)来连接数据库,并且在代码中编写相应的SQL语句来操作数据库。 下面是一个Java web项目连接MySQL数据库的示例: 1. 在pom.xml文件中添加MySQL驱动依赖 ```xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.25</version> </dependency> ``` 2. 在项目中编写连接MySQL数据库的代码 ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DatabaseUtil { private static final String URL = "jdbc:mysql://localhost:3306/test"; private static final String USER = "root"; private static final String PASSWORD = "123456"; public static Connection getConnection() { Connection conn = null; try { Class.forName("com.mysql.cj.jdbc.Driver"); conn = DriverManager.getConnection(URL, USER, PASSWORD); } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } return conn; } } ``` 3. 在代码中使用Connection对象执行SQL语句,例如: ```java import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class UserDao { public User getUserById(int id) { User user = null; try (Connection conn = DatabaseUtil.getConnection(); PreparedStatement ps = conn.prepareStatement("SELECT * FROM user WHERE id=?")) { ps.setInt(1, id); try (ResultSet rs = ps.executeQuery()) { if (rs.next()) { user = new User(); user.setId(rs.getInt("id")); user.setName(rs.getString("name")); user.setAge(rs.getInt("age")); } } } catch (SQLException e) { e.printStackTrace(); } return user; } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值