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

时间:2015-06-05 18:24:01

标签: java tomcat db2

找到解决方案:我在Tomcat lib文件夹中将db2jcc4.jar放在Tomcat 8上,我们很高兴。但是,同样不适用于Tomcat7,因此我将db2jcc.jar从项目外部jar引用中取出,让服务器确定使用哪个版本

原始问题

谷歌搜索为这个问题提出了一系列神秘的参考资料:与jre 1.7一起使用的db2jcc版本。

db2版本

This page lists the driver downloads,但不是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上开发和测试的项目是在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"
/> 

2 个答案:

答案 0 :(得分:1)

此问题已在上述评论及更新中得到解答。

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

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

答案 1 :(得分:0)

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