找到的解决方案 :我将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" />
上面的评论和更新中已经回答了这个问题。
具体来说:将已知可与给定Tomcat版本一起使用的jar文件放在服务器上的lib文件夹中,然后将其从应用程序中删除,这将允许服务器处理连接而不是应用程序,特别是在我们使用连接池时。
因此,我们可以将db2jcc.jar放置在tomcat 7上,将db2jcc4.jar放置在tomcat 8上,并且在部署到任一服务器时都不需要更改应用程序代码。