zoukankan      html  css  js  c++  java
  • jdbc14 及 jdbc16 共存所带来的问题【未完待续】

    在JAVA中JDK版本号与JDBC版本号的一致性十分重要,开发都们经常会忽略了这一点导致非常多不必要的错误。

    昨天给客户排查了一个关于EDB在JBoss中使用时关于这方面的问题,希望给大家一点启示。


    系统环境:

    Red Hat Enterpirse Linux 6

    JBoss Enterprise Application Server 6

    EnterpriseDB Postgres Plus Advanced Server 9

    Oracle JDK 1.6


    问题症状:

    在JBoss日志中间歇性地出现下面错误

    java.sql.SQLException: javax.resource.ResourceException: IJ000453: Unable to get managed connection for java:/jdbc/DSZY101----Caused by: javax.resource.ResourceException: IJ000453: Unable to get managed connection for java:/jdbc/DSZY101--       at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.getManagedConnection(AbstractConnectionManager.java:390)--         at org.jboss.jca.core.connectionmanager.tx.TxConnectionManagerImpl.getManagedConnection(TxConnectionManagerImpl.java:368)--         at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.allocateConnection(AbstractConnectionManager.java:464)--         at org.jboss.jca.adapters.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:159)--         at jp.co.toyota.perz060.servlet.CCERZ060.getConnection(CCERZ060.java:489)--   at jp.co.toyota.perz060.servlet.CCERZ060.doPost(CCERZ060.java:118)--         at javax.servlet.http.HttpServlet.service(HttpServlet.java:754)--      at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)-- at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329)--  at org.apache.catalina.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.StandardEngineValve.invoke(StandardEngineValve.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)----Caused by: javax.resource.ResourceException: IJ000658: Unexpected throwable while trying to create a connection: null--          at org.jboss.jca.core.connectionmanager.pool.mcp.SemaphoreArrayListManagedConnectionPool.getConnection(SemaphoreArrayListManagedConnectionPool.java:371)--         at org.jboss.jca.core.connectionmanager.pool.AbstractPool.getSimpleConnection(AbstractPool.java:397)--    at org.jboss.jca.core.connectionmanager.pool.AbstractPool.getConnection(AbstractPool.java:365)--   at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.getManagedConnection(AbstractConnectionManager.java:329)--         at org.jboss.jca.core.connectionmanager.tx.TxConnectionManagerImpl.getManagedConnection(TxConnectionManagerImpl.java:368)--         at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.allocateConnection(AbstractConnectionManager.java:464)--         at org.jboss.jca.adapters.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:159)--         at jp.co.toyota.perz060.servlet.CCERZ060.getConnection(CCERZ060.java:489)--   at jp.co.toyota.perz060.servlet.CCERZ060.doPost(CCERZ060.java:118)--         at javax.servlet.http.HttpServlet.service(HttpServlet.java:754)--      at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)-- at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329)--  at org.apache.catalina.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.StandardEngineValve.invoke(StandardEngineValve.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)----Caused by: javax.resource.ResourceException: Could not create connection-- at org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory.getLocalManagedConnection(LocalManagedConnectionFactory.java:277)--         at org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory.createManagedConnection(LocalManagedConnectionFactory.java:235)--         at org.jboss.jca.core.connectionmanager.pool.mcp.SemaphoreArrayListManagedConnectionPool.createConnectionEventListener(SemaphoreArrayListManagedConnectionPool.java:761)--         at org.jboss.jca.core.connectionmanager.pool.mcp.SemaphoreArrayListManagedConnectionPool.getConnection(SemaphoreArrayListManagedConnectionPool.java:343)--         at org.jboss.jca.core.connectionmanager.pool.AbstractPool.getSimpleConnection(AbstractPool.java:397)--    at org.jboss.jca.core.connectionmanager.pool.AbstractPool.getConnection(AbstractPool.java:365)--   at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.getManagedConnection(AbstractConnectionManager.java:329)--         at org.jboss.jca.core.connectionmanager.tx.TxConnectionManagerImpl.getManagedConnection(TxConnectionManagerImpl.java:368)--         at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.allocateConnection(AbstractConnectionManager.java:464)--         at org.jboss.jca.adapters.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:159)--         at jp.co.toyota.perz060.servlet.CCERZ060.getConnection(CCERZ060.java:489)--   at jp.co.toyota.perz060.servlet.CCERZ060.doPost(CCERZ060.java:118)--         at javax.servlet.http.HttpServlet.service(HttpServlet.java:754)--      at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)-- at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329)--  at org.apache.catalina.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.StandardEngineValve.invoke(StandardEngineValve.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)----Caused by: com.edb.util.PSQLException: The connection attempt failed.--        at com.edb.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:189)--   at com.edb.core.ConnectionFactory.openConnection(ConnectionFactory.java:64)--        at com.edb.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:161)--        at com.edb.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:30)-- at com.edb.jdbc3g.AbstractJdbc3gConnection.<init>(AbstractJdbc3gConnection.java:23)--   at com.edb.jdbc4.AbstractJdbc4Connection.<init>(AbstractJdbc4Connection.java:31)-- at com.edb.jdbc4.Jdbc4Connection.<init>(Jdbc4Connection.java:25)--     at com.edb.Driver.makeConnection(Driver.java:391)-- at com.edb.Driver.connect(Driver.java:266)--    at org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory.getLocalManagedConnection(LocalManagedConnectionFactory.java:249)--         at org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory.createManagedConnection(LocalManagedConnectionFactory.java:235)--         at org.jboss.jca.core.connectionmanager.pool.mcp.SemaphoreArrayListManagedConnectionPool.createConnectionEventListener(SemaphoreArrayListManagedConnectionPool.java:761)--         at org.jboss.jca.core.connectionmanager.pool.mcp.SemaphoreArrayListManagedConnectionPool.getConnection(SemaphoreArrayListManagedConnectionPool.java:343)--         at org.jboss.jca.core.connectionmanager.pool.AbstractPool.getSimpleConnection(AbstractPool.java:397)--    at org.jboss.jca.core.connectionmanager.pool.AbstractPool.getConnection(AbstractPool.java:365)--   at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.getManagedConnection(AbstractConnectionManager.java:329)--         at org.jboss.jca.core.connectionmanager.tx.TxConnectionManagerImpl.getManagedConnection(TxConnectionManagerImpl.java:368)--         at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.allocateConnection(AbstractConnectionManager.java:464)--         at org.jboss.jca.adapters.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:159)--         at jp.co.toyota.perz060.servlet.CCERZ060.getConnection(CCERZ060.java:489)--   at jp.co.toyota.perz060.servlet.CCERZ060.doPost(CCERZ060.java:118)--         at javax.servlet.http.HttpServlet.service(HttpServlet.java:754)--      at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)-- at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329)--  at org.apache.catalina.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.StandardEngineValve.invoke(StandardEngineValve.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)----Caused by: java.net.SocketException: Too many open files--      at java.net.Socket.createImpl(Socket.java:397)--  at java.net.Socket.<init>(Socket.java:371)--        at java.net.Socket.<init>(Socket.java:189)--   at com.edb.core.PGStream.<init>(PGStream.java:70)--     at com.edb.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:115)--   at com.edb.core.ConnectionFactory.openConnection(ConnectionFactory.java:64)--        at com.edb.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:161)--        at com.edb.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:30)-- at com.edb.jdbc3g.AbstractJdbc3gConnection.<init>(AbstractJdbc3gConnection.java:23)--   at com.edb.jdbc4.AbstractJdbc4Connection.<init>(AbstractJdbc4Connection.java:31)-- at com.edb.jdbc4.Jdbc4Connection.<init>(Jdbc4Connection.java:25)--     at com.edb.Driver.makeConnection(Driver.java:391)-- at com.edb.Driver.connect(Driver.java:266)--    at org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory.getLocalManagedConnection(LocalManagedConnectionFactory.java:249)--         at org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory.createManagedConnection(LocalManagedConnectionFactory.java:235)--         at org.jboss.jca.core.connectionmanager.pool.mcp.SemaphoreArrayListManagedConnectionPool.createConnectionEventListener(SemaphoreArrayListManagedConnectionPool.java:761)--         at org.jboss.jca.core.connectionmanager.pool.mcp.SemaphoreArrayListManagedConnectionPool.getConnection(SemaphoreArrayListManagedConnectionPool.java:343)--         at org.jboss.jca.core.connectionmanager.pool.AbstractPool.getSimpleConnection(AbstractPool.java:397)--    at org.jboss.jca.core.connectionmanager.pool.AbstractPool.getConnection(AbstractPool.java:365)--   at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.getManagedConnection(AbstractConnectionManager.java:329)--         at org.jboss.jca.core.connectionmanager.tx.TxConnectionManagerImpl.getManagedConnection(TxConnectionManagerImpl.java:368)--         at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.allocateConnection(AbstractConnectionManager.java:464)--         at org.jboss.jca.adapters.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:159)--         at jp.co.toyota.perz060.servlet.CCERZ060.getConnection(CCERZ060.java:489)--   at jp.co.toyota.perz060.servlet.CCERZ060.doPost(CCERZ060.java:118)--         at javax.servlet.http.HttpServlet.service(HttpServlet.java:754)--      at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)-- at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329)--  at org.apache.catalina.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.StandardEngineValve.invoke(StandardEngineValve.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 - -


    问题分析:

    1. 从上面的错误代码中可见“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及以上版本号。

    2. 由以上怀疑点要求客户调出系统中存放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应该是不会对它进行调用的。



    3. 进一步分析,客户告知在他们的代码中有可能出现下面操作:
      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进行数据序列化操作时,因版本号不正确应就有可能产生以上问题。

      这就解析了为何仅仅有少量操作报连接无法找到而不是所有数据库连接均报错。

    4. 进一步检查在还有一套客户的測试环境中没有出现以上错误。而此測试环境下仅仅有edb-jdbc16.jar驱动

    5. 从EDB数据库方面分析。在数据库日志中并没有在此上述时段收到连接,也没有对应错误。

      推断:JAVA端在获得连接Socketport后因为版本号不正确应,无法序列化,因此可能根本上就没有发送username、password等登陆信息。因此数据库没有不论什么日志。

    6. 综上所述基本定位问题所在


    分析图解:



    解决方式:

    1. 申请停机时间。进行完整測试及修复。
    2. 建议将文件夹中的edb-jdbc14.jar删除;
    3. 严格保证日后全部项目中相应一个数据库仅仅有一个JDBC;
    4. 在JBoss框架下严格使用JNDI或其它公共方式进行连接,避免在JAVA程序中通过直接调用getConnection方式进行数据库连接;


    解决结果【未进行】:

    当前以上所暴露的问题仅仅是一个判断。因为客户当前是一个生产系统,无法现场进行測试及修复。【未完待续】

  • 相关阅读:
    Java 开发必装的 IntelliJ IDEA 插件
    paoding-rose 之 maven配置
    jetty之maven配置
    paoding rose controller包及文件名命名规则
    PowerMock进行mock测试
    谈谈我的windows服务器运维管理
    谈谈RPC中的异步调用设计
    系统:WSL(win10的子系统Linux)
    信息安全攻防基础
    线性规划计算工具Lingo
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/7047284.html
Copyright © 2011-2022 走看看