最近临时被借调去JAVA项目组,LEAD一个JAVA项目。其实TEAM就两个人。呵呵。
是在一个使用opencms的website上做一些新功能的开发 。11月10日顺利的交付并部署到客户的测试环境上。结果昨天也就是11月11日客户反映说website应用无法访问了。
这还了得,客户的麻烦就是我们的麻烦。迅速的去查看WAS的错误日志,SystemOut的log文件。提示的是OPENCMS读取自身的一个Table时抛出了一个init org.opencms.db.CmsUserDriver的异常。咦,咋会这个样子捏,OPENCMS这么不靠谱?询问客户了解到,原来当天有做过Oracle DB的IP的改动。其他的貌似没有做过变动。
OPENCMS在读取Table的时候才抛出异常,说明DB是可以连结的。那么问题出在哪呢?难道DB在IP修改操作时正好OPENCMS的系统在维护自身Table的数据,从而造成了系统数据的损坏?但是用SQLDeveloper去查看数据也未发现异常。网上找到的资料也是驴唇不对马嘴。只有一篇文章标题看起来像是和我遇到的问题一样,结果点进去一看,!@#¥¥%是也不知道是法语还是德语,天知道他写了啥。不过看文章最后的回复还留着作者的几个大大的问号,估计也是没解决的。
客户在催,请教了其他同事也未有结果。向领导寻求帮助,领导又把球踢回来:也没别人,就你了,你是可以滴,你行滴,是要发挥主观能动性滴....
唉,领导不愧是领导啊。一番语重心长的话下来,虽然问题没解决,但是我又英勇的扑向了org.opencms.db.CmsUserDriver这个拦路虎。
既然OPENCMS的系统数据看起来没啥,那问题会不会出在别的地方涅?又仔细观察了log文档。注意到一个细节,WAS在启动OPENCMS应用的时候,init CmsUserDriver的时候是抛出过一个 JAVA.LANG.ARRAYINDEXOUTOFBOUNDSEXCEPTION。这下狐狸露出尾巴了。看来之前的判断有误啊,会不会是驱动的问题捏?换了个低版本的驱动,重启WAS,NND,激动人心的画面终于出来了。激动啊,激动啊,同志们~~~
但这是为啥捏,最后在网上找到了答案。原来是IBM的一个已知的BUG。Oracle 10g的Driver在运行在1.4.2地版本JDK的WAS时的一个BUG。IBM提供了一个WAS的Patch,打上就好了。
这么一个破BUG,真是折腾了我一把。总结:
Bug Description: JAVA.LANG.ARRAYINDEXOUTOFBOUNDSEXCEPTION at oracle.jdbc.driver.T4CPreparedStatement.doOall8 T4CPreparedStatement.java
Problem Cause:The problem is caused when JIT compilation of methods results in a memop being generated for the first argument to size verification quads. This cannot be specifically made out from the external JAVA code. The problem is because the optimizer if free to tag either of the sources to quads as a memory operand, but the code generator expects that first argument be a non-memory operand.
Local fix :Workaround : JITC_COMPILEOPT=NQUD_DU or JITC_COMPILEOPT=COMPILING:SKIP{oracle/jdbc/driver/T4CPreparedSta tement}{doOall8}
本次发生的环境:
WAS 5.1
IBM JDK 1.4.2
ORACLE 9i
来自IBM的消息:
http://www-01.ibm.com/support/docview.wss?uid=swg1PK53402