2011-04-05 75 views
78

Estoy tratando de crear una conexión a mi base de datos, cuando puse a prueba mi código usando el método principal, funciona a la perfección. Sin embargo, cuando intenta acceder a través de Tomcat 7, falla con el error:Cómo solucionar: "No se encontró un controlador adecuado para el error jdbc: mysql: // localhost/dbname" cuando se usan pools?

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

Estoy usando la agrupación. Puse en bibliotecas mysql connector (5.1.15), dbcp (1.4) y pool (1.4.5) en WEB-INF/lib y en .classpath también. Estoy usando Eclipse IDE. Mi código para el controlador de base de datos es:

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

inicio de mi seguimiento de la pila:

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 

lo que está causando este error?

+1

Tenga en cuenta que esto definitivamente no es el enfoque correcto para utilizar las instalaciones de conexión de agrupación de Tomcat. – BalusC

+0

Otra cosa a tener en cuenta es la sintaxis de la url de conexión. Tuve 'jdbc: mysql // localhost: 3306' en lugar de' jdbc: mysql: // localhost: 3306' –

Respuesta

46

Intente poner el contenedor del controlador en la carpeta lib del servidor. ($ CATALINA_HOME/lib)

Creo que el grupo de conexiones debe configurarse incluso antes de que se cree una instancia de la aplicación. (Al menos eso es cómo funciona en Jboss)

+0

Esto también me ayudó cuando estaba configurando TeamCity. Copiar jar desde el archivo zip independiente de plataforma en la carpeta solicitada en la configuración de TeamCity y pulsar el botón actualizar controladores. –

39

La razón por la que se produjo el error:

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

se debe a que usted se olvidó de registrar su controlador JDBC de MySQL con la aplicación java.

Esto es lo que escribió:

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

En caso de ser esto:

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

Vas a tener que leer el manual en su controlador específico JDBC de MySQL para encontrar la exacta cadena para colocar dentro del parámetro Class.forName ("...").

Class.forName no se requiere con JDBC v.4

A partir de Java 6, Class.forName("something.jdbc.driver.YourFubarDriver") ya no es necesario si se utiliza un controlador reciente (JDBC v.4). Para más detalles leyeron: http://onjava.com/pub/a/onjava/2006/08/02/jjdbc-4-enhancements-in-java-se-6.html

+1

Antes del lanzamiento de la especificación JDBC 4.0, la aplicación cliente necesitaba cargar la clase Driver a través del comando Class.forName ("..."). Incluso revisé el archivo META-INF/services/java.sql.Driver. En mi caso, la aplicación funciona bien en el servidor embarcadero (vía maven o independiente), pero cuando trato de ejecutarlo en otros servidores (probé en tomcat y glassfish) me sale un error. Incluso traté de copiar mysql-connector-java-5.1.18.jar dentro de apache-tomcat-7.0.23/lib, por lo que podría ser la causa de que no se ejecute en estos servidores. – Pramod

+5

He descubierto que con Tomcat 7 y Java 7 es necesario ejecutar Class.forName ("something.jdbc.driver.YourFubarDriver"); Al menos esto resolvió este problema para mí en una implementación. El mismo .war funcionó bien en Tomcat 5.5 con Java 6, pero arrojó la excepción de controlador no adecuado el 7/7. –

+2

No, comenzando con Java 6, Class.forName ("something.jdbc.driver.YourFubarDriver") ya no es necesario ** si ** utiliza un controlador reciente (JDBC v.4). Probablemente con Tomcat 7 utilizaste un controlador anterior que con Tomcat 5.5. Ver Javadoc de DriverManager para más detalles. – Pino

1

si está utilizando NetBeans Debe añadir al controlador JDBC de MySQL en la lista de bibliotecas del proyecto, en las propiedades de su proyecto

3

que tenía el mismo problema, todo lo que tiene que hacer es definir la variable de entorno classpath de Tomcat, puede hacerlo mediante la adición de un archivo, en mi caso C:\apache-tomcat-7.0.30\bin\setenv.bat, que contiene:

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

luego el código, en mi caso:

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

funciona bien.

+0

Esto me ayudó mucho, pero en mi caso tuve que cambiar de 'DriverManager.getConnection ("jdbc: mysql: // localhost: 3306; user = username; password = password; database = databasename") 'to' DriverManager.getConnection ("jdbc: mysql: // localhost: 3306/databasename", "user") , "contraseña") ' – desw

+0

Esto resolvió el problema –

1

También tuve el mismo problema anteriormente, pero he resuelto ese problema.

Puede haber diferentes motivos para esta excepción. Y una de ellas puede ser que el jar que está agregando a su carpeta lib puede ser antiguo.

Intente averiguar la última versión de mysql-connector-jar y agréguelo a su classpath. Puede resolver su problema. El mío fue resuelto así.

0

Cuando se desarrolla usando Ubuntu (Xubuntu 12.04.1) I 'había' para hacer lo siguiente:

Usando

Eclipse Juno (descargado, no se instala a través del centro de software), Tomcat 7 (descargado en un directorio de usuario personalizado) también agregado como Servidor en Eclipse, Proyecto web dinámico con un Servlet 3.0, Servidor MySQL en localhost configurado y probado con usuario y contraseña (asegúrese de probar) Controlador de conector MySQL 5.1.24 jar,

I 'HAD', y repito 'HAD', para nosotros la sentencia Class.Load ("com.mysql.jdbc.Driver") junto con la adición del conector driver.jar para que esté en la carpeta lib del proyecto web. trabajar en esta situación

IMPORTANTE !!: después de copiar el archivo driver.jar a la lib, asegúrese de actualizar su proyecto en Eclipse antes de ejecutar el servlet a través de Tomcat.

Intenté agregar el archivo jar del controlador del conector a través de la ruta de compilación con y sin ClassLoad, pero no funcionó.

Espero que esto ayude a cualquiera que comience el desarrollo en esta situación específica: la comunidad Java proporciona una "MUCHA" documentación pero hay tantas variables que es difícil cubrirlas todas y hace las cosas muy difíciles para el nuevo tipo.

Creo que si alguien pudiera explicar por qué se requiere Class.Load aquí (en esta situación) sería beneficioso.

Disfrute

31

que tenían el mismo problema usando Tomcat7 con conector mysql-java-5.1.26 que puse en tanto mi $ CATALINA_HOME/lib y WEB-INF/lib, por si acaso. Pero no lo encontraría hasta que use cualquiera de estas dos afirmaciones antes de conseguir la conexión:

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

O

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

entonces he seguido con la eliminación de mysql-para conector java-5.1.26 desde $ CATALINA_HOME/lib y la conexión aún funciona.

+0

No necesita ninguno de los enunciados, para mí funcionó simplemente moviendo el conector a WEB-INF/lib. –

+3

* Usted * no debería necesitarlos. Sin embargo, depende en gran medida de la versión del controlador/versión del sistema operativo/versión de Tomcat/versión de Java. Incluso las combinaciones "recientes" de controladores y JDK pueden fallar. Para estar seguro, debe usar Class.forName –

+1

"should not need" y la realidad es diferente =) Tiene que registrar el controlador cuando se ejecuta bajo Tomcat 7 y 8. – Alfishe

0

Dado que nadie dio esta respuesta, también me gustaría añadir que, simplemente puede agregar el archivo de controlador jdbc (mysql-connector-java-5.1.27-bin.jar en mi caso) a la carpeta lib de su servidor (Tomcat en mi caso). Reinicie el servidor y debería funcionar.

+1

No es realmente un buen consejo, especialmente si tiene varias aplicaciones con diferentes versiones de controlador – Alfishe

8

Al ejecutar Tomcat fuera de eclipse no elegirá la lib establecida en CATALINA_HOME/lib, hay dos maneras de solucionarlo. Haga doble clic en el servidor Tomcat en los servidores de eclipse ver, se abrirá el gato plugin de configuración, entonces:

  1. Haga clic en "Abrir Lanzamiento de configuración"> ficha de ruta de clases fijar el/j ubicación frasco conector MySQL. o
  2. ubicación del servidor> seleccione la opción que dice "Uso de instalación de Tomcat (tomar el control de la instalación de Tomcat)"
1

La mayor parte de tiempo que esto suceda porque dos-conector mysql-java-3.0.14-producción-bin archivo .jar Una carpeta en lib de tomcat y otra en classpath del proyecto.

Intente quitar mysql-connector-java-3.0.14-production-bin.jar de la carpeta lib.

De esta manera me funciona.

2

Estoy ejecutando Tomcat 7 en Eclipse con Java 7 y utilizando el controlador jdbc para MSSQL sqljdbc4.jar.

Cuando se ejecuta el código fuera del Tomcat, desde una aplicación Java independiente, esto funcionó muy bien:

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

Sin embargo, cuando traté de ejecutar el mismo código dentro de Tomcat 7, encontré que pude Sólo conseguir que funcione mediante el registro por primera vez el conductor, cambiando la anterior a esta:

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

tuve la biblioteca JDBC de MySQL tanto en $ CATALINA_HOME/lib y WEB-INF/lib, todavía tengo este error. Necesitaba Class.forName ("com.mysql.jdbc.Driver"); para hacer que funcione

1

De lo que he observado puede haber dos razones para que ocurra esta excepción: (1) Su nombre de controlador no está escrito correctamente. (2) El controlador no se ha Asociado correctamente con el Proyecto Java Pasos a seguir en Eclipse: (1) Cree un nuevo Proyecto Java. (2) copiar El conector Jar archivo (3) Haga clic con el botón derecho en el proyecto Java y péguelo allí. (4) Haga clic con el botón derecho en el proyecto Java -> Propiedades -> Ruta de compilación Java -> bibliotecas -> Agregar tarro -> elija su proyecto (seleccione el archivo jar del menú desplegable) y haga clic en Aceptar.

-2

Usted puede pegar el frasco en el camino de tiempo de ejecución de JBoss como esto:

C: \ Usuario \ usuario \ espacio de trabajo \ jboss-as-web-7.0.0.Final \ \ implementaciones independientes \ MYapplicationEAR .ear \ test.war \ WEB-INF \ lib ca marche 100%

0
  1. Put mysql-connector-java-5.0.8-bin.jar en $ CATALINA_HOME/lib

  2. Compruebe si hay error ortográfico en la url de conexión, ejemplo
    "jdbc: mysql: // localhost: 3306/report"('informe' aquí es el nombre db)

  3. Asegúrese de utilizar el nombre de la máquina (ejemplo: localhost en lugar de la dirección IP (127.0.0.1))
0

Añadir la clase del controlador a la bootstrapclasspath. El problema está en java.sql.DriverManager que no ve los controladores cargados por ClassLoaders aparte de bootstrap ClassLoader.

0

De otro hilo StackOverflow:..

"Segundo Asegúrese de que tiene el controlador JDBC de MySQL también conocido como conector/J en la ruta de clase de JMeter Si no - descargarlo, descomprimir y soltar mysql-connector-java- x.xx.xx-bin.jar a la carpeta/lib de JMeter. se requerirá el reinicio de JMeter para recoger la biblioteca arriba"

Por favor asegúrese de que el archivo .jar se añade directamente a la carpeta lib.

1

La solución es sencilla.

Asegúrese de que el conector de la base de datos puede ser alcanzado por su ruta de clase cuando corriendo (no compilar) el programa, por ejemplo:

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

Además, si usted está usando un viejo versión de Java (JDBC pre 4.0), antes de hacer DriverManager.getConnection se requiere esta línea:

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

añadir el artefacto de experto.

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

Uso:

try { 

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

} catch (Exception e) { 

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

} 

DriverManager.getConnection(.. 
+0

¡Buena respuesta! Es posible que desee explicar por qué funciona el código :) – Max

+0

ESTA ES LA RESPUESTA CORRECTA EN MI CASO – Hatim

2

Bro, también puede escribir el código de la siguiente manera:

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

     } 

} 
Cuestiones relacionadas