[英]java.lang.AbstractMethodError: org.postgresql.jdbc3.Jdbc3Connection.isValid(I)Z
[英]java.lang.AbstractMethodError: com.mysql.jdbc.Connection.isValid(I)Z
我正在尝试使用 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.lang.AbstractMethodError: com.mysql.jdbc.Connection.isValid(I)Z
这意味着 MySQL JDBC 驱动程序已经过时,因此它不支持 Java 1.6 的Connection#isValid()
方法。
升级吧。 并确保运行时类路径中只有一个 MySQL JDBC 驱动程序 JAR 文件。
对我来说,解决方案不是升级我的驱动程序(JT400)。 即使是最新版本 (9.1) 似乎也没有实现 isValid() (它在代码中被注释掉了?)。
对我有用的是为我的数据库连接池提供验证查询。 例如:
validationQuery=SELECT current date FROM sysibm.sysdummy1
net.sourceforge.jtds.jdbc.JtdsConnection
没有实现isValid()
因此,您需要指定连接测试查询以确保不调用isValid()
方法isValid()
下行添加到application.properties
文件为我解决了错误。
spring.datasource.hikari.connection-test-query=SELECT 1
就我而言,我将 ojdbc 从 verion 14 升级到 6。我有工件 ojdbc14,然后我将其更改为 ojdbc6。 我在这里迷失了一段时间,因为我认为 14 是 14>6 的更高版本。 但是 14 是为 java 1.4 设计的。 6 表示 java6
这是我读到的关于 isValid 方法( source )的内容。 驱动程序(此处为 MySQL)会尝试检查您的连接是否有效。 不确定它是如何工作的(因为即使我的 MySQL 实例/服务启动并运行,它也不允许连接)。 因此,请在 spring application.properties 文件中使用以下字符串
spring.datasource.hikari.connection-test-query=select 1 from dual (或任何测试查询,-select sysdate from dual)
对我来说,我在数据库连接池配置中添加了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"/>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.