【问题标题】:SQLException: No suitable driver found [duplicate]SQLException:找不到合适的驱动程序[重复]
【发布时间】:2011-08-24 08:54:10
【问题描述】:

我有一个 Java 类,它通过 JDBC 访问 MySQL 数据库,我在 Tomcat 上运行的 JSP 中使用该类,但我得到了 No Driver Found Exception。

我有一个方法:

private static Statement makeStatement() {
   try{
    com.mysql.jdbc.Driver d = null;
    try{d = new com.mysql.jdbc.Driver();}catch(Exception e){
      System.out.println("ERROR BY NEW DRIVER " + e.toString() + 
      "\n");e.printStackTrace();}
    Connection con = DriverManager.getConnection(url, user, password);
    return con.createStatement();
   }catch(java.sql.SQLException ex){
      System.out.println("ERROR IN makeStatement " + "\nERROR - " +
      ex.toString() +  "\n ERROR CODE:\n " + ex.getErrorCode() + 
      "\nSQLSTATE:\n " + ex.getSQLStat        e());ex.printStackTrace();}
    return null;
 }

这会在Connection con = DriverManager.getConnection(url, user, password); 处引发错误这是我从 catalina.out 打印出来的:

  Received Parameters

ERROR IN makeStatement 
ERROR - java.sql.SQLException: No suitable driver found for 
 ERROR CODE:
 0
SQLSTATE:
 08001
java.sql.SQLException: No suitable driver found for 
        at java.sql.DriverManager.getConnection(DriverManager.java:602)
        at java.sql.DriverManager.getConnection(DriverManager.java:185)
        at message.Message.makeStatement(Message.java:72)
        at message.Message.query(Message.java:79)
        at message.Message.getName(Message.java:225)
        at org.apache.jsp.message_jsp._jspService(message_jsp.java:288)
        at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
        at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331)
        at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
        at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:548)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874)
        at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
        at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
        at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
        at java.lang.Thread.run(Thread.java:619)
ERROR IN QUERY java.lang.NullPointerException
ERROR in getName java.lang.NullPointerException
-----------------------------------

  Received Parameters

        newMessage      =  
        newpassword     = 
        verifypassword  = 
        sendinfo        = 
        username        = Eli
        newusername     = 
        login   = login
        password        = tree
ERROR IN makeStatement 
ERROR - java.sql.SQLException: No suitable driver found for 
 ERROR CODE:
 0
SQLSTATE:
 08001
java.sql.SQLException: No suitable driver found for 
        at java.sql.DriverManager.getConnection(DriverManager.java:602)
        at java.sql.DriverManager.getConnection(DriverManager.java:185)
        at message.Message.makeStatement(Message.java:72)
        at message.Message.query(Message.java:79)
        at message.Message.validUser(Message.java:195)
        at org.apache.jsp.message_jsp._jspService(message_jsp.java:123)
        at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
        at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331)
        at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
        at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:548)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874)
        at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
        at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
        at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
        at java.lang.Thread.run(Thread.java:619)
ERROR IN QUERY java.lang.NullPointerException
ERROR in validUser java.lang.NullPointerException
ERROR IN makeStatement 
ERROR - java.sql.SQLException: No suitable driver found for 
 ERROR CODE:
 0
SQLSTATE:
 08001
java.sql.SQLException: No suitable driver found for 
        at java.sql.DriverManager.getConnection(DriverManager.java:602)
        at java.sql.DriverManager.getConnection(DriverManager.java:185)
        at message.Message.makeStatement(Message.java:72)
        at message.Message.query(Message.java:79)
        at message.Message.getName(Message.java:225)
        at org.apache.jsp.message_jsp._jspService(message_jsp.java:288)
        at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
        at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331)
        at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
        at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:548)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874)
        at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
        at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
        at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
        at java.lang.Thread.run(Thread.java:619)
ERROR IN QUERY java.lang.NullPointerException
ERROR in getName java.lang.NullPointerException

唯一重要的错误是makeStatement() 中的错误,因为失败会导致所有其他错误。我已经四次检查我的 WEB-INF/lib 目录中是否有正确的 jar 文件,并且我重新启动 Tomcat 的次数比我想要的要多。我有一个单独的 webapp,它在不同的 .java 文件中使用 makeStatement(),并且该 webapp 运行良好。更奇怪的是我在 .java 中有这个:

static {
  System.err.println("\n\nTEST MYSQL ACCESS: dump all relevant tables:");
  dump();
  System.err.println("END OF MYSQL ACCESS ACCESS.");
}

 public static void dump() {
   try {
     readUsers();
     for (UserRecord u: users)
     System.err.println(u.username+" "+u.password);
   } catch (Exception e) {System.err.println(e);}
 }

其中readUsers() 使用makeStatement() 从数据库中读取所有用户。这实际上可行,并且打印了数据库中的所有用户(由于明显的原因,此处未显示:)),然后发生未找到驱动程序错误。

【问题讨论】:

    标签: mysql jsp tomcat jdbc sqlexception


    【解决方案1】:

    java.sql.SQLException: 找不到合适的驱动程序

    此异常可能有 2 个原因:

    1. 根本没有加载 JDBC 驱动程序。
    2. URL 与任何加载的 JDBC 驱动程序都不匹配。

    由于驱动程序似乎已加载(尽管方式不正确),因此 URL 看起来完全错误。确保您的 url 变量的值与以下格式匹配

    jdbc:mysql://localhost:3306/dbname
    

    另见:


    与具体问题无关:Java 代码不属于 JSP 文件。也为此努力。您的异常处理也很糟糕,您应该抛出异常(以便它阻止执行代码的剩余部分)而不是打印消息/跟踪,然后继续执行代码。

    【讨论】:

    • URL 在初始化函数中声明为:url = "jdbc:mysql://localhost:"+port+"/"+user;
    • DriverManager.getConnection(url, user, password) 呼叫之前执行System.out.println("The URL is: " + url);。我认为这不是你想的那样。
    • 此代码不在 JSP 中。它在一个 .java 中,我编译并保存在 jsps WEB-INF/lib 目录中的一个 jar 中。我对错误处理不是很好;这是我需要复习的事情之一
    • 你是对的。第一次调用makeStatement() 后,URL 为空。现在要弄清楚为什么...
    • 只需运行一个调试器,您就可以逐行执行代码并探索堆栈中的所有变量。
    【解决方案2】:

    我必须从 WEB-INF/lib 中删除 mysql-connector-java-*.jar 并将其添加 到 tomcat6/lib 文件夹中。 (tomcat6 是安装 tomcat 的地方。)我不知道为什么这样做,但它对我有用。

    【讨论】:

    • 您能多评论一下您的解决方案吗?
    【解决方案3】:

    您是否向 Driver 注册了您的课程?例如:

    Class.forName("net.sourceforge.jtds.jdbc.Driver");
    DriverManager.getConnection(url,user,password);
    

    【讨论】:

    • new Driver() 已经做到了。然而,这有一个巨大的缺点,即 JDBC 驱动程序现在也是编译时依赖项,而不是单独的运行时依赖项(换句话说:代码不是很便携/可重用)。这就是为什么建议通过Class#forName() 加载 JDBC 驱动程序而不是简单地导入/实例化它们。有关技术背景信息,请参阅stackoverflow.com/questions/2092659/…
    • 谢谢你这么说。我一直只是在驱动程序管理器中注册了这个类,甚至没有考虑实例化驱动程序本身。
    【解决方案4】:

    您是否将一个空的 url 字符串传递给 getConnection()?错误信息开始了

    No suitable driver found for ERROR
    

    没有为 [空白] 找到合适的驱动程序?好像你没有在这里传递一个网址。

    【讨论】:

    • 我确实觉得这有点奇怪,但 URL 在 init 函数中声明为:url = "jdbc:mysql://localhost:"+port+"/"+user;
    【解决方案5】:

    进入项目的库文件夹并右键单击它,然后进入“添加库”选项。现在添加 mysql.jdbc.Driver

    【讨论】:

    • 您能否通过屏幕截图或更好的格式改进您的问题
    • 这个问题在 3 1/2 年前得到了正确回答。
    猜你喜欢
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 2019-08-24
    • 2015-04-25
    相关资源
    最近更新 更多