那些在实际项目中让人怀疑智商的狗血问题

    最近在项目中遇到的一些问题,时自己在整个解决过程中,感到无比的狗血和无奈,虽然经过三天的艰苦奋战,那些问题得到了解决,但伤的我也不轻啊。在电脑执行数据入库的过程中,挤出点时间,描述自己的这次浩劫。

    第一次发现这个问题是在某个上班的早上,因为以为生产服务器不会出问题,我们的项目不会出问题,就一直在做其他事情(学习和敲代码),很久没有登录项目了,更别提看过后台运行日志,客户也没有任何反馈,就一直以为项目运行的很好。可是就在这个早晨,我无意间远程连接了web服务器,想看看tomcat的后台运行日志,不看不知道,这一看可是吓一跳呢。在查看日志的时候,我惊讶的发现后台报了很多异常,提取出了其中的关键信息如下:

   1.[c3p0] NewPooledConnection close Exception.
java.sql.SQLException: Io 异常: Socket read timed out

2.警告: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@17f8cd93 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!

3.com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@17f8cd93 -- APPARENT DEADLOCK!!! Complete Status: 
    Managed Threads: 3
    Active Threads: 3
    Active Tasks: 

4.com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@3efa6be3 -- Acquisition Attempt Failed!!! Clearing pending acquires. While trying to acquire a needed new resource, we failed to succeed more than the maximum number of allowed acquisition attempts (30). Last acquisition attempt exception: 
java.sql.SQLException: Io 异常: The Network Adapter could not establish the connection

  首先来分析一下以上主要异常:

第一个异常是在说:c3p0的连接采集异常关闭。套接字读取超时。

第二个异常是在说:明显的死锁。在等待期间,紧急创建未分配任务的线程。

第三个异常是在说:明显的死锁,列出线程的完全状态:托管线程,活动线程,活动任务等的状态。

第四个异常是在说:捕获尝试失败,清除失败,直到超过允许补货的最大次数,也没有成功。数据库异常,网络适配器无法建立连接。

上面四个主要异常信息只说明一件事,那就是数据库服务器出现了问题(要么网路断了,要么死机了,要么彻底关机了)。在这个基础上,我尝试着原程连接数据库服务器时,连接不成功,那就更加证实了以上问题的存在,于是我去了机房,果然不出所料,数据库服务器关机了。这是第一次遇到这种情况,我居然天真的以为是人为原程关机的,就重新开了机,看了下网络连接是正常的,就没多想。可是在第三天早上,我发现数据库服务器又关机了,额,就算上次是人为,那么这次呢,这是我才意识到问题没有我想的那么简单,于是我调出了数据库服务器的系统日志,主要异常摘抄如下:

用户 xxxxxx为这台计算机上一次意外的关机提供的原因是: 其他故障: 系统没有反应
 原因代码: 0x8000005。这就说明服务器是因为死机而关机的,但到目前为止,没有找到死机的原因,初步猜测是:跟项目数据库有关。于是为了验证这个猜测,我的做法是在web服务器上安装数据库服务(ORACLE 12C)。然后把数据库服务器中的数据转移到web服务器上,让项目运行一段时间,看看web服务器会不会意外死机导致关机。在web服务器上安装好ORACLE12C数据库后,很顺利的将数据库服务器中的数据转移了过来,等一切搞定之后(配置数据库连接文件),我满心欢喜的启动了tomcat,这就是狗血问题的开始。当我看到tomcat控制台打印出的一大串异常后,我彻底懵逼了,第一反应就是查看数据库连接配置文件db.properties。仔细核对一番,IP地址是127.0.0.1当前电脑没有错,端口1521没有错,实例名orcl没有错,用户名C##XXXX和密码XXXXX都没有错,格式也没有任何问题。于是再次启动了Tomcat,还是报跟上次一样的异常。此时的我,以为是ORACLE12C没装好,就卸了重装,装好导入数据再试,试了还是报同样的异常,就在一次脑残的认为数据库没装好,再次又给卸了,重装,就这样卸了三次,装了三次,整整花了我两天时间。这期间,我还以为在迁移数据的过程中,导致了表结构的不一致,于是我将迁移前和迁移后的DDL(数据定义语言,通俗说就是数据表的创建语言)导出来,使用Winmerge数据对比软件进行了对比,发现表结构完全一致。这下我更加找不到北了,我这样安慰自己,这不就是每个软件开发工程师的真实生活吗,就是要活在一次次的问题之中,遇到问题是种幸运,每一次遇到烫手的问题,就是你技术猛进一步的动力。虽然没有找到问题根源,但至少排除了表结构不一致和数据库安装不正确的可能,只要自己一次次试下去,就会排除更多不是问题根源的问题。离解决问题就会更近一步。就这样,一遍安慰着自己,一边气到想摔了键盘砸了电脑,还一边怀疑自己的智商。一边一遍遍的尝试。试来试去,最后排除了数库本身问题,配置问题,安装问题,网络问题(因为自己访问自己都访问不了,这肯定不是网络问题)。

    功夫不负有心人,山重水复疑无路,拨开迷雾见日出。就在第三天下午,我仔细看了下tomcat的异常信息。才发现了导致问题的根源。一句异常信息点醒了我。

java.sql.SQLException: ORA-28040: No matching authentication protocol:翻译过来就是:没有匹配的认证协议。在追根寻源,发现这是SQL异常,也就是说,是数据库服务发来的异常。是没有匹配的认证协议,而不是连接失败什么的。这就说明用户向web服务器发送登录请求时,web服务器的对应类要连接数据库进行用户名密码的验证,而问题就出在这个环节,在连接数据库时,无法匹配你的认证协议。这才是我苦苦寻找了三天的问题根源,ORA-28040。类似于 ORA-28040 这样的错误,是ORACLE12C的固定异常错误,产生这种异常的原因一般很单一,解决手段也是固定的。因此结合了ORACLE12C,找到了解决办法和问题原因:

这个异常是因为:用了Oracle11g的驱动连接12c的数据库导致的。

解决方式是:(1)更新驱动。(2)在%ORACLE_HOME%\NETWORK\ADMIN\sqlnet.ora文件中的最后一行配置:

 SQLNET.ALLOWED_LOGON_VERSION=8

就能解决问题了。事后再回头看看脑残的自己,显得无比可笑,但这有怎样呢,最起码这次让你明白了:以后遇到项目中的问题,不要想的太远,首先就从当前tomcat报的异常入手,仔细分析异常,问题的答案一般就在这里。不过,这就是一名IT工作者的真实生活,感谢那些曾经玩你玩到怀疑人生的编程错误,真实因为它们,才成就了一个更牛逼的自己,加油,不忘初心,继续努力,砥砺前行。

 

   

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值