データソースを使用してサーブレットを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ドライバーを追加しましたが、これでも役に立ちませんでしたか?誰かが私を助けることができればそれは非常に高く評価されるでしょう
Java.lang.AbstractMethodError:com.mysql.jdbc.Connection.isValid(I)Z
これは、MySQL JDBCドライバーが古く、Java 1.6の Connection#isValid()
メソッドをサポートしていないことを意味します。
アップグレード 。また、ランタイムクラスパスにMySQLJDBCドライバーJARファイルが1つしかないことを確認してください。
私にとっての解決策は、ドライバー(JT400)をアップグレードすることではありませんでした。最新バージョン(9.1)でさえisValid()を実装していないようです(コードでコメントアウトされていますか?)。
私にとってうまくいったのは、データベース接続プールにvalidationQueryを提供することでした。例えば。:
validationQuery=SELECT current date FROM sysibm.sysdummy1
_net.sourceforge.jtds.jdbc.JtdsConnection
_はisValid()
を実装していません
したがって、isValid()
メソッドが呼び出されないようにconnection-test-queryを指定する必要があります。_application.properties
_ fileに次の行を追加すると、エラーが解決しました。
_spring.datasource.hikari.connection-test-query=SELECT 1
_
私の場合、ojdbcをバージョン14から6にアップグレードしました。アーティファクトojdbc14があったので、それをojdbc6に変更しました。 14は14> 6として後のバージョンだと思ったので、私はここでかなりの時間を失いました。ただし、14はJava 1.4を意味します。6はJava6を意味します