记录我的一次现场部署项目出现的项目卡死问题,如对您无帮助,请勿喷,谢谢。
前言
这两天在现场帮忙部署项目,部署启动之后走不了几步项目就崩了,直接卡死,不管是用 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 连接,发现问题解决,具体原因我再查询下相关的资料,如果有结果我会在最近一周做补充,如果没的话就当此贴完结,谢谢大家听我发了半天牢骚。希望里面的内容能对您有帮助!