106

我正在尝试创建与我的数据库的连接,当我使用 main 方法测试我的代码时,它可以无缝运行。但是,当尝试通过 Tomcat 7 访问它时,它会失败并出现错误:

No suitable driver found for jdbc:mysql://localhost/dbname. 

我正在使用池化。我在 WEB-INF/lib 和 .classpath 中放入了 mysql 连接器 (5.1.15)、dbcp (1.4) 和 pool(1.4.5) 库。我正在使用 Eclipse IDE。我的数据库驱动程序代码是:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import org.apache.tomcat.dbcp.dbcp.ConnectionFactory;
import org.apache.tomcat.dbcp.dbcp.DriverManagerConnectionFactory;
import org.apache.tomcat.dbcp.dbcp.PoolableConnectionFactory;
import org.apache.tomcat.dbcp.dbcp.PoolingDriver;
import org.apache.tomcat.dbcp.pool.impl.GenericObjectPool;

public class DatabaseConnector {
    public static String DB_URI = "jdbc:mysql://localhost/dbname";
    public static String DB_USER = "test";
    public static String DB_PASS = "password";

    // Singleton instance
    protected static DatabaseConnector _instance;

    protected String _uri;
    protected String _username;
    protected String _password;

    /**
     * Singleton, so no public constructor
     */
    protected DatabaseConnector(String uri, String username, String password) {
        _uri = uri;
        _username = username;
        _password = password;

        GenericObjectPool connectionPool = new GenericObjectPool(null);
        ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(
            _uri, _username, _password);
        PoolableConnectionFactory poolableConnectionFactory =
            new PoolableConnectionFactory(connectionFactory, connectionPool,
                                            null, null, false, true);
        PoolingDriver driver = new PoolingDriver();
        driver.registerPool("test", connectionPool);
    }

    /**
     * Returns the singleton instance
     */
    public static DatabaseConnector getInstance() {
        if (_instance == null) {
            _instance = new DatabaseConnector(DB_URI, DB_USER, DB_PASS);
        }
        return _instance;
    }

    /**
     * Returns a connection to the database
     */
    public Connection getConnection() {
        Connection con = null;
        try {
            con = DriverManager.getConnection("jdbc:apache:commons:dbcp:test");
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return con;
    }
}

我的堆栈跟踪的开始:

Apr 5, 2011 9:49:14 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [Login] in context with path [/Project] 
threw exception
java.lang.RuntimeException: java.sql.SQLException: 
No suitable driver found for jdbc:mysql://localhost/dbname

是什么导致了这个错误?

4

21 回答 21

67

尝试将驱动程序 jar 放在服务器 lib 文件夹中。($CATALINA_HOME/lib)

我相信甚至在应用程序实例化之前就需要设置连接池。(至少在 Jboss 中是这样工作的)

于 2011-04-05T18:57:41.720 回答
48

您收到此错误的原因:

java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/dbname

是因为您忘记在 java 应用程序中注册您的 mysql jdbc 驱动程序。

这是你写的:

Connection con = null;
try {
    con = DriverManager.getConnection("jdbc:apache:commons:dbcp:test");
} catch (SQLException e) {
    throw new RuntimeException(e);
}

应该是这样的:

Connection con = null;
try {
    //registering the jdbc driver here, your string to use 
    //here depends on what driver you are using.
    Class.forName("something.jdbc.driver.YourFubarDriver");   
    con = DriverManager.getConnection("jdbc:apache:commons:dbcp:test");
} catch (SQLException e) {
    throw new RuntimeException(e);
}

您必须阅读特定 mysql jdbc 驱动程序的手册才能找到要放置在 Class.forName("...") 参数中的确切字符串。

JDBC v.4 不需要 Class.forName

从 Java 6 开始,Class.forName("something.jdbc.driver.YourFubarDriver")如果您使用最新的 (JDBC v.4) 驱动程序,则不再需要。有关详细信息,请阅读: http: //onjava.com/pub/a/onjava/2006/08/02/jjdbc-4-enhancements-in-java-se-6.html

于 2011-09-14T17:43:13.697 回答
41

我在使用 Tomcat7 和 mysql-connector-java-5.1.26 时遇到了同样的问题,我把它放在了我的 $CATALINA_HOME/lib 和 WEB-INF/lib 中,以防万一。但是直到我在获得连接之前使用这两个语句中的任何一个才会找到它:

DriverManager.registerDriver(new com.mysql.jdbc.Driver ());

或者

Class.forName("com.mysql.jdbc.Driver");

然后我从 $CATALINA_HOME/lib 中删除了 mysql-connector-java-5.1.26 并且连接仍然有效。

于 2013-10-08T22:26:35.213 回答
8

当从 Eclipse 中运行 tomcat 时,它不会选择设置的库CATALINA_HOME/lib,有两种方法可以修复它。在 Eclipse 服务器视图中双击 Tomcat 服务器,它将打开 Tomcat 插件配置,然后:

  1. 单击“打开启动配置”> 类路径选项卡设置 mysql 连接器/j jar 位置。或者
  2. 服务器位置 > 选择“使用 Tomcat 安装(控制 Tomcat 安装)”选项
于 2014-01-04T20:02:23.717 回答
4

我在 $CATALINA_HOME/lib 和 WEB-INF/lib 中都有 mysql jdbc 库,但仍然出现此错误。我需要 Class.forName("com.mysql.jdbc.Driver"); 让它工作。

于 2014-11-05T15:58:29.627 回答
4

兄弟,你也可以写如下代码:

import java.sql.*;
import java.io.*;
public class InsertDatabase {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    try
    {  
        Class.forName("com.mysql.jdbc.Driver");  
        Connection con=DriverManager.getConnection(  
        "jdbc:mysql://localhost:3306/Maulik","root","root");  

        Statement stmt=con.createStatement();  
        ResultSet rs=stmt.executeQuery("select * from Employee");  
        while(rs.next())  
        System.out.println(rs.getInt(1)+"  "+rs.getString(2)+"  "+rs.getString(3));  
        con.close();
    }

    catch(Exception e)
    {
        System.out.println(e);
    }

        }  

}
于 2017-01-30T11:03:26.690 回答
3

我有同样的问题,你需要做的就是为tomcat定义类路径环境变量,你可以通过添加一个文件来完成,在我的例子C:\apache-tomcat-7.0.30\bin\setenv.bat中,包含:

set "CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\lib\mysql-connector-java-5.1.14-bin.jar"

然后代码,在我的情况下:

Class.forName("com.mysql.jdbc.Driver").newInstance(); 
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/database_name", "root", "");

工作正常。

于 2012-09-19T14:04:27.747 回答
3

我之前也遇到过同样的问题,但我解决了这个问题。

此异常可能有不同的原因。其中之一可能是您添加到 lib 文件夹的 jar 可能是旧的。

尝试找出最新的 mysql-connector-jar 版本并将其添加到您的类路径中。它可能会解决您的问题。我的就这样解决了。

于 2013-01-10T07:11:09.957 回答
3

我在 Eclipse 中使用 Java 7 运行 Tomcat 7,并为 MSSQL sqljdbc4.jar 使用 jdbc 驱动程序。

从独立的 java 应用程序在 tomcat 之外运行代码时,这工作得很好:

        connection = DriverManager.getConnection(conString, user, pw);

但是,当我尝试在 Tomcat 7 中运行相同的代码时,我发现我只能通过首先注册驱动程序来使其工作,将上面的内容更改为:

        DriverManager.registerDriver(new com.microsoft.sqlserver.jdbc.SQLServerDriver());
        connection = DriverManager.getConnection(conString, user, pw);
于 2014-10-21T20:51:12.130 回答
3

从 Maven 添加工件。

 <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.6</version>
 </dependency>
于 2016-10-01T12:17:48.953 回答
3

采用:

try {

    Class.forName("com.mysql.jdbc.Driver").newInstance();
    System.out.println("Registro exitoso");

} catch (Exception e) {

    System.out.println(e.toString());

}

DriverManager.getConnection(..
于 2016-12-26T23:39:17.463 回答
1

如果您使用的是 netbeans,则必须在项目的库列表中,在项目的属性中添加 Mysql JDBC 驱动程序

于 2012-07-05T19:10:37.930 回答
1

大多数时候它发生是因为两个 mysql-connector-java-3.0.14-production-bin.jar 文件。一个在tomcat的lib文件夹中,另一个在项目的类路径中。

只需尝试从 lib 文件夹中删除 mysql-connector-java-3.0.14-production-bin.jar 。

这样它对我有用。

于 2014-06-03T12:35:38.533 回答
1

根据我的观察,发生此异常的原因可能有两个:(1)您的驱动程序名称拼写不正确。(2)驱动程序没有与Java项目正确关联 在Eclipse中要遵循的步骤: (1)创建一个新的Java项目。(2) 复制连接器 Jar 文件 (3) 右键单击​​ Java 项目并将其粘贴到那里。(4)右键单击Java项目->属性->Java构建路径->库->添加Jar->选择你的项目(从下拉列表中选择jar文件)并单击确定。

于 2015-02-10T01:14:48.210 回答
1

解决方案很简单。

确保在运行(而不是编译)程序时,您的类路径可以访问数据库连接器,例如:

java -classpath .;c:\path\to\mysql-connector-java-5.1.39.jar YourMainClass 

此外,如果您使用的是旧版本的 Java(JDBC 4.0 之前),则在执行 DriverManager.getConnection此操作之前需要:

Class.forName("your.jdbc.driver.TheDriver"); // this line is not needed for modern Java
于 2016-07-29T10:23:39.743 回答
0

使用 Ubuntu (Xubuntu 12.04.1) 开发时,我“必须”执行以下操作:

使用

Eclipse Juno(已下载,未通过软件中心安装)、Tomcat 7(在自定义用户目录中下载)也添加为 Eclipse 中的服务器、带有 3.0 Servlet 的动态 Web 项目、本地主机上的 MySQL 服务器,并使用用户和密码进行了配置和测试(确保测试)MySQL 连接器驱动程序 5.1.24 jar,

我'HAD',我重复'HAD',对我们Class.Load(“com.mysql.jdbc.Driver”)语句以及将连接器driver.jar添加到Web项目lib文件夹中以使其工作在这个情况下。

重要!!:将 driver.jar 复制到 lib 后,请确保在 Eclipse 中刷新项目,然后再通过 Tomcat 运行 servlet。

我确实尝试通过带有和不带有 ClassLoad 的构建路径添加连接器驱动程序 jar 文件,但它不起作用!

希望这可以帮助任何人在这种特定情况下开始开发:Java 社区提供了“很多”文档,但是变量太多,很难涵盖所有这些变量,这对新人来说非常困难。

我认为如果有人可以解释为什么需要 Class.Load (在这种情况下),那将是有益的。

享受

于 2013-03-14T19:06:12.353 回答
0

由于没有人给出这个答案,我还想补充一点,您可以将 jdbc 驱动程序文件(mysql-connector-java-5.1.27-bin.jar在我的情况下)添加到服务器的 lib 文件夹(在我的情况下是 Tomcat)。重新启动服务器,它应该可以工作。

于 2013-12-03T17:51:00.900 回答
0
  1. 将 mysql-connector-java-5.0.8-bin.jar 放入 $CATALINA_HOME/lib

  2. 检查连接 url 中的拼写错误,例如
    “jdbc:mysql://localhost:3306/report”(这里的“report”是数据库名称)

  3. 确保使用机器名(例如:localhost 而不是 ip 地址(127.0.0.1))
于 2015-08-15T12:08:28.007 回答
0

将驱动程序类添加到引导类路径。问题出在 java.sql.DriverManager 中,除了 bootstrap ClassLoader 之外,没有看到 ClassLoader 加载的驱动程序。

于 2015-10-27T22:05:41.913 回答
0

从其他stackoverflow线程:

“第二。确保你在 JMeter 的类路径中有 MySQL JDBC Driver aka Connector/J。如果你没有 - 下载它,解压并将 mysql-connector-java-x.xx.xx-bin.jar 放到 JMeter 的 /lib 中文件夹。需要重新启动 JMeter 才能获取库”

请确保将 .jar 文件直接添加到 lib 文件夹中。

于 2016-04-25T17:47:09.430 回答
-2

您可以将 jar 粘贴在 jboss 的运行时路径中,如下所示:

C:\User\user\workspace\jboss-as-web-7.0.0.Final\standalone\deployments\MYapplicationEAR.ear\test.war\WEB-INF\lib ca marche 100%

于 2015-06-07T16:30:36.453 回答