atalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)-- at jp.co.toyota.pzy1352.util.CIZY1392.doFilter(CIZY1392.java:362)-- at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280)-- at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)-- at jp.co.toyota.pzy1900.util.CIZY1947.doFilter(CIZY1947.java:99)-- at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280)-- at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)-- at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275)-- at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)-- at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153)-- at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155)-- at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)-- at org.apache.catalina.core.StandardEngineva lve.invoke(StandardEngineva lve.java:109)-- at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368)-- at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:505)-- at org.apache.coyote.ajp.AjpProtocol$AjpConnectionHandler.process(AjpProtocol.java:452)-- at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:931)-- at java.lang.Thread.run(Thread.java:662)-- E 2014-06-15 20:27:44.272 XML - 0 - -
问题分析: 从上面的错误代码中可见“javax.resource.ResourceException: IJ000658: Unexpected throwable while trying to create a connection: null”,从经验上判断这可能是由于JDK版本与JDBC不匹配所造成的。当前各
数据库都有类似的操作方式,通常针对JDK 1.6以下版本,及1.6以上版本会发布不同的JDBC驱动包,以EDB为例会有:
edb-jdbc14.jar 对应 JDK1.6以下版本;
edb-jdbc16.jar 对应 JDK1.6及以上版本。
由以上怀疑点要求客户调出
系统中存放JDBC驱动的目录,发现在此目录下同时存在以上两个版本的jar文件,同时此目录中有一个module.xml文件,当中内存如下:
<modulexmlns="urn:jboss:module:1.0"name="com.edb"> <resources> <resource-rootpath="edb-jdbc16.jar"/> resources> <dependencies><modulename="javax.api"/>dependencies> module> 从此文件中可以看到JBoss中已经明确指定使用edb-jdbc16.jar,因此即使目录中同时也有edb-jdbc14.jar,JBoss应该是不会对它进行调用的。 进一步分析,客户告知在他们的代码中有可能出现以下操作: Class.forName("com.edb.Driver"); String url = "jdbc:edb://xxx.xxx.xxx.xxx:5444/edb"; String user = "enterprisedb"; String password = "xxxxxxx"; Connection con = DriverManager.getConnection(url, user, password); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM emp"); ...... 由此推断如果客户代码中存在以上操作,在运行此操作时将不授JBoss中的配置影响而直接通过JDK调用可以找到的JDBC。由于目录中存在edb-jdbc14.jar,而从目录的搜索角度14排在16之前,因此程序在执行以上操作时很可能会使用了edb-jdbc14.jar。在JAVA进行数据序列化操作时,因版本不对应就有可能产生以上问题。这就解析了为何只有少量操作报连接无法找到而不是全部数据库连接均报错。 进一步检查在另一套客户的测试环境中没有出现以上错误,而此测试环境下只有edb-jdbc16.jar驱动 从EDB数据库方面分析,在数据库日志中并没有在此上述时段收到连接,也没有相应错误。判断:JAVA端在获得连接Socket端口后由于版本不对应,无法序列化,因此可能根本上就没有发送用户名、密码等登陆信息,因此数据库没有任何日志。 综上所述基本定位问题所在 分析图解:  解决方案: 申请停机时间,进行完整测试及修复; 建议将目录中的edb-jdbc14.jar删除;严格保证日后所有项目中对应一个数据库只有一个JDBC;在JBoss框架下严格使用JNDI或其他公共方式进行连接,避免在JAVA程序中通过直接调用getConnection方式进行数据库连接; 解决结果【未进行】:
当前以上所暴露的问题只是一个推断,由于客户当前是一个生产系统,无法现场进行测试及修复。【未完待续】
|