与 JRE 1.7 一起使用的 db2jcc.jar 版本错误?

Bad version of db2jcc.jar used with JRE 1.7?

找到解决方案:我最终将 db2jcc4.jar 放在 Tomcat 8 上 Tomcat lib 文件夹中,我们可以开始了.然而,同样不适用于 Tomcat7,所以我从项目外部 jar 引用中取出 db2jcc.jar 并让服务器确定要使用的版本

原题

谷歌搜索为这个问题提供了大量含糊不清的参考资料:哪个版本的 db2jcc 与 jre 1.7 一起使用。

This page lists the driver downloads 通过 db2 版本,但不是 JRE。

让我陷入这个谜团的问题是我们有两台 Tomcat 服务器,一台 运行 JRE 1.8 和一台 运行 1.7。奇怪的是,前者是运行 Tomcat 7,后者是Tomcat 8。(你可以问,但我没有答案)

所以我们的开发代码 运行 可以很好地从我们的 Tomcat 7 JRE 1.8 系统连接到 db2,但是部署到我们的 Tomcat 8 JRE 1.7 服务器的其他东西恐怕会被破坏通过在那里更新到 JRE 1.8,所以我们怀疑一个错误,如下所示,是 JRE 1.7 和我们的 db2jcc.jar 文件之间的版本不匹配。

但也许 Tomcat 8 有问题。

从堆栈跟踪中提取的错误:

java.lang.AbstractMethodError: com.ibm.db2.jcc.t4.b.isValid(I)Z

现在是最后一个问题,我在 Tomcat 7 JRE 1.8 上开发和测试的项目是在符合 JRE 1.7 的 Eclipse 中构建的。那么为什么我们会得到这个错误呢?这似乎是版本兼容性问题?

更完整(但不完整)的堆栈跟踪

    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:574)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:461)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
 root cause javax.servlet.ServletException: java.lang.AbstractMethodError: com.ibm.db2.jcc.t4.b.isValid(I)Z
    org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:908)
    org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:837)
    org.apache.jsp.getTimesheetsForUser_jsp._jspService(getTimesheetsForUser_jsp.java:112)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    root cause java.lang.AbstractMethodError: com.ibm.db2.jcc.t4.b.isValid(I)Z
    org.apache.tomcat.dbcp.dbcp2.DelegatingConnection.isValid(DelegatingConnection.java:913)
    org.apache.tomcat.dbcp.dbcp2.PoolableConnection.validate(PoolableConnection.java:226)
    org.apache.tomcat.dbcp.dbcp2.PoolableConnectionFactory.validateConnection(PoolableConnectionFactory.java:302)
    org.apache.tomcat.dbcp.dbcp2.BasicDataSource.validateConnectionFactory(BasicDataSource.java:2208)
    org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:2191)
    org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:1945)
    org.apache.tomcat.dbcp.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:1412)
    com.hr.timesheets.JDBCConnection.queryProdData(JDBCConnection.java:226)
    com.hr.timesheets.TimeSheetQueryManager.getTimesheets(TimeSheetQueryManager.java:624)
    com.hr.timesheets.TimeSheetQueryManager.generateUploadsForUser(TimeSheetQueryManager.java:343)
    org.apache.jsp.getTimesheetsForUser_jsp._jspService(getTimesheetsForUser_jsp.java:94)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

任何人都可以在这里看到我们团队缺少的明显东西吗?以前有其他人遇到过这个问题吗?

注意:我们正在使用 context.iml 文件中配置的连接资源池,如下所示:

<Resource auth="Container" 
name="jdbc/hrdb2"
type="javax.sql.DataSource" 
driverClassName="com.ibm.db2.jcc.DB2Driver"
url="jdbc:db2://hrdb2.hr.com:50200/time"
username="redacted" 
password="redacted"
maxIdle="10"
maxActive="400"
maxWait="5"
removeAbandoned="true"
removeAbandonedTimeout="1200"
/> 

此问题已在上面的评论和更新中得到解答。

具体来说:将已知可用于给定 Tomcat 版本的 jar 文件放入服务器上的 lib 文件夹中,然后将其从应用程序中删除,从而允许服务器处理连接而不是应用程序,特别是当我们使用连接池时。

因此我们可以将 db2jcc.jar 放在 tomcat 7 上,将 db2jcc4.jar 放在 tomcat 8 上,应用程序代码在部署到任一服务器时都不需要更改。

我在升级我的 db2 驱动程序版本时遇到了非常困难的时间,我的 POM.xml 中有 db2jcc4 依赖项并通过系统路径 ${project.basedir}/src/main/webapp/WEB-INF/lib/db2jcc-db2jcc4 找到它。罐 同样在我的 wepapp/WEB-INF/lib 文件夹中,我有正确的 db2 jar,但仍然出现上述相同的错误。 我正在使用 Intellij Idea 作为我的 IDE 并且错过了一些细节,即删除我从项目设置>库中设置的 db2 的旧依赖项,我的项目仍然指向 db2jcc 旧版本,删除了那个旧库从那里我的项目又开始了 运行。