与 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 旧版本,删除了那个旧库从那里我的项目又开始了 运行。
找到解决方案:我最终将 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 旧版本,删除了那个旧库从那里我的项目又开始了 运行。