小编典典

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

tomcat

找到的解决方案 :我将db2jcc4.jar放在Tomcat 8的Tomcat lib文件夹中的Tomcat
8上,我们一切顺利。但是,对于Tomcat7而言,这同样不起作用,因此我从项目外部jar引用中删除了db2jcc.jar,然后让服务器确定要使用哪个版本

原始问题

Googling为这个问题提供了一系列神秘的参考:与jre 1.7一起使用的db2jcc版本。

该页面列出了按db2版本而不是JRE
下载的驱动程序

使我感到困惑的问题是,我们有两台Tomcat服务器,一台运行JRE 1.8,另一台运行1.7。奇怪的是,前者正在运行Tomcat
7,而后者正在运行Tomcat8。(您可以问,但我对此没有答案)

因此,我们的开发代码运行良好,可以从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上开发和测试的项目是在Eclipse中构建的,并且符合JRE
1.7。那么,为什么会出现此错误?它似乎是版本兼容性问题吗?

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

    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"
/>

阅读 618

收藏
2020-06-16

共1个答案

小编典典

上面的评论和更新中已经回答了这个问题。

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

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

2020-06-16