2011-04-05 68 views
78

我想創建一個連接到我的數據庫,當我用主方法測試我的代碼時,它可以無縫工作。但是,試圖通過Tomcat的7訪問它時,它失敗,錯誤:如何解決:在使用池時,找不到適用於jdbc:mysql:// localhost/dbname的驅動程序錯誤?

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 

是什麼原因造成這個錯誤?

+1

請注意,這是絕對不能使用Tomcat的連接池設施,正確的做法。 – BalusC 2011-04-05 19:09:20

+0

另一件需要注意的是連接url的語法。我有'jdbc:mysql // localhost:3306'而不是'jdbc:mysql:// localhost:3306' – 2014-12-17 05:26:06

回答

46

嘗試將驅動程序jar放入服務器lib文件夾中。 ($ CATALINA_HOME/lib)

我相信即使在實例化應用程序之前也需要設置連接池。 (至少,它是如何工作的Jboss)

+0

當我創建TeamCity時,這也對我有所幫助。將Platform Independent zip文件中的jar複製到TeamCity設置中提示的文件夾中,並點擊刷新驅動程序按鈕。 – 2015-03-22 04:58:59

39

你得到這個錯誤的原因:

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第4節

與Java 6,Class.forName("something.jdbc.driver.YourFubarDriver")開始

的Class.forName不再是必需的,如果你使用最新(JDBC第4節)驅動程序。有關詳細信息閱讀:http://onjava.com/pub/a/onjava/2006/08/02/jjdbc-4-enhancements-in-java-se-6.html

+1

在發佈JDBC 4.0規範之前,客戶端應用程序需要通過命令Class.forName(「...」)加載Driver類。我甚至檢查過META-INF/services/java.sql.Driver文件。在我的情況下,應用程序在jetty服務器(通過maven或獨立運行)中運行正常,但是當我嘗試在其他服務器(我在tomcat和glassfish中測試)中運行它時,出現以上錯誤。我甚至試圖將mysql-connector-java-5.1.18.jar複製到apache-tomcat-7.0.23/lib中,這可能是因爲它沒有在這些服務器上運行。 – Pramod 2011-12-14 07:20:05

+5

我發現在Tomcat 7和Java 7中,它再一次需要執行Class.forName(「something.jdbc.driver.YourFubarDriver」);至少這在一次部署中解決了這個問題。同樣的.war和Java 6一起在Tomcat 5.5上工作得很好,但是在7/7上拋出了沒有合適的驅動程序例外。 – 2012-05-03 23:16:31

+2

不,從Java 6開始,Class.forName(「something.jdbc.driver.YourFubarDriver」)不再必要**如果**您使用最近的(JDBC v.4)驅動程序。可能與Tomcat 7相比,使用舊版驅動程序的地方比使用Tomcat 5.5的版本要多。有關詳細信息,請參閱DriverManager的Javadoc。 – Pino 2012-09-13 13:49:48

1

,如果你使用的是NetBeans必須添加MySQL JDBC驅動程序中的項目庫列表中,在您的項目

3

我有同樣的問題的性質,所有你需要做的

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

然後代碼,在我的情況:被定義爲Tomcat的CLASSPATH環境變量,您可以通過添加一個文件,在我的情況C:\apache-tomcat-7.0.30\bin\setenv.bat,包含做

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

工作正常。

+0

這幫了我很多,但在我的情況下,我不得不從'DriverManager改變。getConnection(「jdbc:mysql:// localhost:3306; user = username; password = password; database = databasename」)'DriverManager.getConnection(「jdbc:mysql:// localhost:3306/databasename」,「user」 ,「password」)' – desw 2015-06-29 07:21:10

+0

這解決了我的問題 – 2018-02-25 01:45:39

1

我以前也有同樣的問題,但我解決了這個問題。

此例外情況可能有不同的原因。 其中之一可能是你添加到lib文件夾的jar可能是舊的。

試着找出最新的mysql連接器jar版本並將其添加到您的類路徑中。 它可以解決你的問題。我的解決就是這樣。

0

當使用Ubuntu(Xubuntu上12.04.1)我 '已經' 做到以下幾點發展:

使用

的Eclipse朱諾(下載,而不是通過軟件中心安裝), 的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後,請務必通過Tomcat的運行servlet刷新前Eclipse中的項目。

我曾嘗試通過構建路徑有和沒有的類加載添加連接器驅動程序jar文件,但它沒有工作!

希望這可以幫助任何人從這個特定的情況開始開發:Java社區提供了很多文檔,但是有很多變量很難涵蓋所有這些變量,這使得新人變得非常困難。

我想如果有人可以解釋爲什麼這裏需要Class.Load(在這種情況下),這將是有益的。

享受

31

我不得不使用Tomcat7與MySQL連接器的Java-5.1.26,我把在我的兩個$ CATALINA_HOME/lib和WEB-INF/lib目錄,以防萬一同樣的問題。但是,如果找不到它,直到我用這兩種語句之一獲取連接之前:

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

OR

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

然後我跟進去除的mysql-連接器 - 來自$ CATALINA_HOME/lib的java-5.1.26和連接仍然有效。

+0

您不需要任何語句,對我來說,只需將連接器移動到WEB-INF/lib即可。 – 2013-12-03 11:25:23

+3

你*不需要它們。但是,它高度依賴於驅動程序版本/操作系統版本/ Tomcat版本/ Java版本。即使是「最近」的驅動程序和JDK組合也可能會失敗。爲了安全起見,您需要使用Class.forName – 2014-04-15 07:57:42

+1

「不應該需要」而現實也不同=)必須在Tomcat 7和8下運行時註冊驅動程序。 – Alfishe 2014-07-02 13:07:10

0

由於沒有人給出這個答案,我還想補充一點,你可以添加jdbc驅動文件(在我的情況下爲mysql-connector-java-5.1.27-bin.jar)到你的服務器的lib文件夾(在我的情況下是Tomcat)。重新啓動服務器,它應該工作。

+1

不是一個很好的建議,尤其是如果你有多個應用程序使用不同的驅動程序版本 – Alfishe 2014-07-02 13:08:01

8

當運行Tomcat出日食不會挑CATALINA_HOME/lib的lib一套,有兩種方法可以解決這個問題。在Eclipse服務器Tomcat服務器上雙擊查看,它會打開Tomcat插件的配置,則:

  1. 點擊「打開啓動配置」> Classpath選項卡設置了MySQL連接器/ J的jar位置。 或
  2. 服務器位置>選擇選項,說:
1

多數時候發生的「使用Tomcat安裝(以Tomcat安裝的控制)」,因爲兩個MySQL連接器的Java-3.0.14-生產斌.jar文件。 一個在tomcat的lib文件夾中,另一個在項目的classpath中。

只要嘗試從lib文件夾中刪除mysql-connector-java-3.0.14-production-bin.jar。

這種方式,它爲我工作。

2

我使用Java 7在Eclipse中運行Tomcat 7,並使用MSSQL sqljdbc4.jar的jdbc驅動程序。

當運行Tomcat以外的代碼,從一個獨立的Java應用程序,這工作得很好:

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

然而,當我試圖運行Tomcat 7的內部相同的代碼,我發現我能只有得到它的第一個註冊的驅動程序,改變上述對這項工作:

 DriverManager.registerDriver(new com.microsoft.sqlserver.jdbc.SQLServerDriver()); 
     connection = DriverManager.getConnection(conString, user, pw); 
4

我有MySQL的JDBC庫在這兩個$ CATALINA_HOME/lib和WEB-INF/lib下,我仍然得到這個錯誤。我需要Class.forName(「com.mysql.jdbc.Driver」);使其工作。

1

從我觀察到的情況來看,可能有兩個原因會導致發生此異常: (1)您的驅動程序名稱拼寫不正確。 (2)驅動程序未與Java項目正確關聯 在Eclipse中遵循的步驟: (1)創建一個新的Java項目。 (2)複製連接器Jar文件 (3)右鍵單擊Java項目並將其粘貼到那裏。 (4)右鍵單擊Java項目 - >屬性 - > Java Build Path - > libraries-> Add Jar - >選擇你的項目(從下拉菜單中選擇jar文件)並點擊ok。

-2

你能堅持罐子在這樣的JBoss運行時路徑:

C:\用戶\用戶\工作區\ jboss-as-web-7.0.0.Final \獨立\部署\ MYapplicationEAR的.ear \ test.war \ WEB-INF \ lib中 CA馬爾凱100%

0
  1. 是把MySQL連接器的Java-5.0.8-bin.jar在$ CATALINA_HOME/lib中

  2. 檢查連接URL中的錯字,示例
    「jdbc:mysql:// localhost: 3306 /報告」(‘報告’這裏是數據庫名)

  3. 確保使用機器名(例如:本地主機而不是IP地址(127.0.0.1))
0

添加的驅動程序類的bootstrapclasspath。問題出現在java.sql.DriverManager中,除了bootstrap ClassLoader之外,沒有看到由ClassLoaders加載的驅動程序。

0

從其他計算器螺紋:。

「二請確保您有MySQL JDBC驅動程序也稱爲連接器/ J在JMeter的classpath中如果沒有 - 下載,解壓縮和刪除MySQL連接器,Java的x.xx.xx-bin.jar到JMeter的/ lib文件夾。 JMeter的重新啓動將需要挑庫達」

請確保.jar文件直接添加到lib文件夾。

1

的解決方案是簡單的。

確保數據庫連接器

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

此外,如果您使用的是舊的:當運行(未編譯)程序,如您類路徑到達爪哇(預JDBC 4.0)的版本,你做DriverManager.getConnection之前需要這一行:

Class.forName("your.jdbc.driver.TheDriver"); // this line is not needed for modern Java 
1

從行家添加神器。

<dependency> 
    <groupId>mysql</groupId> 
    <artifactId>mysql-connector-java</artifactId> 
    <version>5.1.6</version> 
</dependency> 
2

用途:

try { 

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

} catch (Exception e) { 

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

} 

DriverManager.getConnection(.. 
+0

好的答案!您可能想要解釋爲什麼代碼有效:) – Max 2016-12-26 23:55:24

+0

這是我的正確答案 – Hatim 2017-03-11 16:54:49

2

兄弟,你也可以如下編寫代碼:

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); 
    } 

     } 

} 
相關問題