【问题标题】:java.lang.AbstractMethodError: com.mysql.jdbc.Connection.isValid(I)Zjava.lang.AbstractMethodError: com.mysql.jdbc.Connection.isValid(I)Z
【发布时间】:2015-12-23 09:01:48
【问题描述】:

我正在尝试使用 data Source 将我的 Servlet 连接到 mysql 数据库。但是每当我运行我的 servlet 时,我最终都会得到这个异常:

java.lang.AbstractMethodError: com.mysql.jdbc.Connection.isValid(I)Z
    org.apache.tomcat.dbcp.dbcp2.DelegatingConnection.isValid(DelegatingConnection.java:913)
    org.apache.tomcat.dbcp.dbcp2.PoolableConnection.validate(PoolableConnection.java:282)
    org.apache.tomcat.dbcp.dbcp2.PoolableConnectionFactory.validateConnection(PoolableConnectionFactory.java:356)
    org.apache.tomcat.dbcp.dbcp2.BasicDataSource.validateConnectionFactory(BasicDataSource.java:2306)
    org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:2289)
    org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:2038)
    org.apache.tomcat.dbcp.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:1532)
    Servlet.AbdulTayyebs.processRequest(AbdulTayyebs.java:36)
    Servlet.AbdulTayyebs.doGet(AbdulTayyebs.java:57)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

这是我的 Content.xml

<Resource name="jdbc/abdultayyebs" auth="Container"
          type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver"
          url="jdbc:mysql://127.0.0.1:4000/abdultayyebs?zeroDateTimeBehavior=convertToNull"
          username="root" password="february1996" maxActive="5" maxIdle="2"
          maxWait="1000"/>

这是我的 web.xml

  <resource-ref>
  <description>DB Connection</description>
  <res-ref-name>jdbc/abdultayyebs</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth></resource-ref>

这是我的 servlet AbdulTayyebs

 import java.io.IOException;
 import java.io.PrintWriter; 
 import java.sql.Connection;
 import java.sql.SQLException;
 import javax.naming.Context;
 import javax.naming.InitialContext;
 import javax.servlet.ServletConfig;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.sql.DataSource;

 public class AbdulTayyebs extends HttpServlet {

  DataSource ds=null;  

 @Override
 public void init(ServletConfig config)throws ServletException{
    try {
     Context initContext = new InitialContext();
     Context envContext  = (Context)initContext.lookup("java:/comp/env");
     ds = (DataSource)envContext.lookup("jdbc/abdultayyebs");  
    } catch (Exception e) {
     throw new ServletException("Something went wrong while Initializing the Servlet",e);
    }
  }

    protected void processRequest(HttpServletRequest request,                   
       HttpServletResponse response)
       throws ServletException,IOException {
       PrintWriter write = response.getWriter();
       try {   
       Others.Action a = Others.ActionFactory.CreateAction(request);
     try(Connection c=ds.getConnection()){
     String page = a.Execute(c,request,request.getSession(false));
       request.getRequestDispatcher(page).forward(request, response); 
      }      
   }     
   catch (SQLException e) {
     write.println(e);
   }
   catch (ServletException e) {
     write.println(e);     
   }
   catch (Exception e) {       
    write.println(e);
   }   
 }

 @Override
 protected void doGet(HttpServletRequest request, HttpServletResponse  response)
        throws ServletException, IOException {
      processRequest(request, response);
   }

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
     processRequest(request, response);
     } 
   }

我还在tomcat的lib文件夹中添加了mysql jdbc驱动程序,但即使这样也没有帮助?如果有人可以帮助我,那将是非常感激的

【问题讨论】:

    标签: java mysql servlets jdbc datasource


    【解决方案1】:

    对于我来说,我在数据库连接池配置中添加了 validationQuery 参数。

    <Resource name="jdbc/abdultayyebs" auth="Container"
          type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver"
          url="jdbc:mysql://127.0.0.1:4000/abdultayyebs?zeroDateTimeBehavior=convertToNull"
          username="root" password="february1996" maxActive="5" maxIdle="2"
          maxWait="1000" validationQuery="SELECT 1"/>
    

    【讨论】:

      【解决方案2】:

      这是我读到的关于 isValid 方法 (source) 的内容。 驱动程序(此处为 MySQL)尝试检查您的连接是否有效。 不确定它是如何工作的(因为即使我的 MySQL 实例/服务启动并运行,它也不允许连接)。 所以,在你的 spring application.properties 文件中使用下面的字符串

      spring.datasource.hikari.connection-test-query=从对偶中选择 1 (或任何测试查询,- 从 dual 中选择 sysdate)

      【讨论】:

        【解决方案3】:

        net.sourceforge.jtds.jdbc.JtdsConnection 没有实现 isValid()

        因此您需要指定一个连接测试查询以确保不调用isValid() 方法 将以下行添加到 application.propertiesfile 为我解决了该错误。

        spring.datasource.hikari.connection-test-query=SELECT 1
        

        【讨论】:

          【解决方案4】:

          就我而言,我将 ojdbc 从版本 14 升级到 6。我有工件 ojdbc14,然后我将其更改为 ojdbc6。我在这里输了很长时间,因为我认为 14 是 14>6 的更高版本。但 14 适用于 java 1.4。 6 表示 java6

          【讨论】:

            【解决方案5】:

            对我来说,解决方案不是升级我的驱动程序 (JT400)。即使是最新版本(9.1)似乎也没有实现 isValid() (它在代码中被注释掉了?)。

            对我有用的是向我的数据库连接池提供验证查询。例如:

            validationQuery=SELECT current date FROM sysibm.sysdummy1
            

            【讨论】:

            • 您愿意分享您的代码吗?我试着这样做...... config.addDataSourceProperty("validationQuery", "SELECT current date FROM sysibm.sysdummy1");
            • validationQuery 是我使用的连接池的一个属性。它与我的配置文件中的 URL、用户名和密码等其他属性一起使用。
            • 如何用 Java 代码做到这一点... config.setConnectionTestQuery("SELECT current date FROM sysibm.sysdummy1");
            • 你在使用连接池吗?您的代码看起来是正确的,所以我猜您可能没有使用池,或者您使用的池不支持该属性。如果您是并且确实如此,则必须检查该池的文档。也就是说,在代码中配置连接池并不常见。考虑通过配置文件来实现。
            • HikariCP 文档提到了一个名为“connectionTestQuery”的属性,这听起来与我正在使用的“validationQuery”等效。他们说如果您的驱动程序不支持 JDBC 4,您应该使用以我为例。
            【解决方案6】:

            java.lang.AbstractMethodError: com.mysql.jdbc.Connection.isValid(I)Z

            这意味着 MySQL JDBC 驱动程序已经过时,因此它不支持 Java 1.6 的 Connection#isValid() 方法。

            Upgrade it。并确保在运行时类路径中只有一个 MySQL JDBC 驱动 JAR 文件。

            另见:

            【讨论】:

            • 谢谢它真的很有帮助
            • 我遇到了与此类似的错误,但使用的是 Oracle DB。升级驱动修复了它。
            • 还有其他可能吗?我正在使用最新版本的 MySQL 连接器(撰写本文时为 8.0.18),但我遇到了同样的异常。
            • @JRSofty:那么您在运行时类路径中不会只有一个 MySQL JDBC 驱动程序 JAR 文件,如答案所示。
            猜你喜欢
            • 1970-01-01
            • 2015-12-08
            • 2018-01-04
            • 1970-01-01
            • 1970-01-01
            • 2017-10-10
            • 1970-01-01
            • 1970-01-01
            • 2022-04-01
            相关资源
            最近更新 更多