web-dev-qa-db-ja.com

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

データソースを使用してサーブレットをmysqlデータベースに接続しようとしています。しかし、サーブレットを実行するたびに、次の例外が発生します。

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>

これが私のサーブレット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ドライバーを追加しましたが、これでも役に立ちませんでしたか?誰かが私を助けることができればそれは非常に高く評価されるでしょう

5
Abdul Tayyeb

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

これは、MySQL JDBCドライバーが古く、Java 1.6の Connection#isValid() メソッドをサポートしていないことを意味します。

アップグレード 。また、ランタイムクラスパスにMySQLJDBCドライバーJARファイルが1つしかないことを確認してください。

参照:

14
BalusC

私にとっての解決策は、ドライバー(JT400)をアップグレードすることではありませんでした。最新バージョン(9.1)でさえisValid()を実装していないようです(コードでコメントアウトされていますか?)。

私にとってうまくいったのは、データベース接続プールにvalidationQueryを提供することでした。例えば。:

validationQuery=SELECT current date FROM sysibm.sysdummy1
6
KC Baltz

_net.sourceforge.jtds.jdbc.JtdsConnection_はisValid()を実装していません

したがって、isValid()メソッドが呼び出されないようにconnection-test-queryを指定する必要があります。_application.properties_ fileに次の行を追加すると、エラーが解決しました。

_spring.datasource.hikari.connection-test-query=SELECT 1
_
3
Rakesh Yadav

私の場合、ojdbcをバージョン14から6にアップグレードしました。アーティファクトojdbc14があったので、それをojdbc6に変更しました。 14は14> 6として後のバージョンだと思ったので、私はここでかなりの時間を失いました。ただし、14はJava 1.4を意味します。6はJava6を意味します

1
Feng Zhang