La infame java.sql.SQLException: no se encontró un controlador adecuado

Intento agregar una JSP habilitada para bases de datos a una aplicación Tomcat 5.5 existente (GeoServer 2.0.0, si eso ayuda).

La aplicación en sí misma habla bien con Postgres, así que sé que la base de datos está activa, el usuario puede acceder a ella, todas esas cosas buenas. Lo que bash hacer es una consulta de base de datos en un JSP que he agregado. He usado el ejemplo de configuración en el ejemplo de fuente de datos de Tomcat bastante fuera de la caja. Los taglibs necesarios están en el lugar correcto, no se producen errores si solo tengo los taglib refs, entonces es encontrar esos JAR. El controlador jdbc de postgres, postgresql-8.4.701.jdbc3.jar está en $ CATALINA_HOME / common / lib.

Aquí está la parte superior de JSP:

   select current_validstart as ValidTime from runoff_forecast_valid_time  

La sección correspondiente de $ CATALINA_HOME / conf / server.xml, dentro de que a su vez está dentro de :

    

Estas líneas son las últimas en la etiqueta en webapps / gs2 / WEB-INF / web.xml:

   The database resource for the MMAS PostGIS database   jdbc/mmas   javax.sql.DataSource   Container   

Finalmente, la excepción:

  exception org.apache.jasper.JasperException: Unable to get connection, DataSource invalid: "java.sql.SQLException: No suitable driver" [...wads of ensuing goo elided] 

La infame java.sql.SQLException: no se encontró un controlador adecuado

Esta excepción puede tener básicamente dos causas:

1. El controlador JDBC no está cargado

Debe asegurarse de que el controlador JDBC esté ubicado en la carpeta /lib propia del servidor.

O bien, cuando en realidad no está utilizando un origen de datos del grupo de conexiones administrado por el servidor, sino que está manipulando manualmente con DriverManager#getConnection() en WAR, debe colocar el controlador JDBC en WAR /WEB-INF/lib y realizar ..

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

.. en su código antes de la primera llamada DriverManager#getConnection() por la que se asegura de que no se traga / ignora cualquier ClassNotFoundException que puede ser lanzada por él y continuar el flujo de código como si nada excepcional sucedió. Consulte también ¿Dónde debo colocar el controlador JDBC para el conjunto de conexiones de Tomcat?

2. O bien, el URL de JDBC tiene una syntax incorrecta

Debe asegurarse de que la URL JDBC cumple con la documentación del controlador JDBC y tenga en cuenta que generalmente distingue entre mayúsculas y minúsculas. Cuando la URL JDBC no devuelve true para Driver#acceptsURL() para cualquiera de los controladores cargados, también obtendrá exactamente esta excepción.

En el caso de PostgreSQL está documentado aquí .

Con JDBC, una base de datos está representada por una URL (Localizador Uniforme de Recursos). Con PostgreSQL ™, esto toma una de las siguientes formas:

  • jdbc:postgresql:database
  • jdbc:postgresql://host/database
  • jdbc:postgresql://host:port/database

En el caso de MySQL está documentado aquí .

El formato general para una URL JDBC para conectarse a un servidor MySQL es el siguiente, con elementos entre corchetes ( [ ] ) que son opcionales:

jdbc:mysql://[host1][:port1][,[host2][:port2]]...[/[database]] » [?propertyName1=propertyValue1[&propertyName2=propertyValue2]...]

En el caso de Oracle , está documentado aquí .

Hay 2 syntax de URL, syntax antigua que solo funcionará con SID y la nueva con el nombre de servicio de Oracle.

Sintaxis antigua jdbc:oracle:thin:@[HOST][:PORT]:SID

Nueva syntax jdbc:oracle:thin:@//[HOST][:PORT]/SERVICE


Ver también:

  • ¿Dónde debo colocar el controlador JDBC para el conjunto de conexiones de Tomcat?
  • Cómo instalar el controlador JDBC en el proyecto web de Eclipse sin enfrentar java.lang.ClassNotFoundexception
  • ¿Cómo debo conectarme a la base de datos / fuente de datos JDBC en una aplicación basada en servlet?
  • ¿Cuál es la diferencia entre “Class.forName ()” y “Class.forName (). NewInstance ()”?
  • Conecte Java a una base de datos MySQL
 url="jdbc:postgresql//localhost:5432/mmas" 

Esa URL parece incorrecta, ¿necesita lo siguiente?

 url="jdbc:postgresql://localhost:5432/mmas" 

Encontré la sugerencia followig útil, para eliminar este problema en Tomcat –

asegúrese de cargar el controlador primero haciendo un Class.forName (“org.postgresql.Driver”); en tu código

Esto es del post – https://www.postgresql.org/message-id/e13c14ec050510103846db6b0e@mail.gmail.com

El código jdbc funcionó bien como un progtwig independiente, pero en TOMCAT dio el error ‘No se encontró ningún controlador adecuado’

Enfrenté el problema similar. Mi proyecto en contexto es Dynamic Web Project (Java 8 + Tomcat 8) y el error es para la excepción del controlador PostgreSQL: no se encontró un controlador adecuado

Se resolvió agregando Class.forName("org.postgresql.Driver") antes de llamar al método getConnection()

Aquí está mi código de muestra:

 try { Connection conn = null; Class.forName("org.postgresql.Driver"); conn = DriverManager.getConnection("jdbc:postgresql://" + host + ":" + port + "/?preferQueryMode=" + sql_auth,sql_user , sql_password); } catch (Exception e) { System.out.println("Failed to create JDBC db connection " + e.toString() + e.getMessage()); } 

Me olvidé de agregar el controlador PostgreSQL JDBC al proyecto Mvnrepository .

Gradle :

 // http://mvnrepository.com/artifact/postgresql/postgresql compile group: 'postgresql', name: 'postgresql', version: '9.0-801.jdbc4' 

Maven :

  postgresql postgresql 9.0-801.jdbc4  

También puede descargar el JAR e importar a su proyecto manualmente.

Vale la pena señalar que esto también puede ocurrir cuando Windows bloquea las descargas que considera inseguras. Esto se puede solucionar haciendo clic con el botón derecho en el archivo jar (como ojdbc7.jar) y marcando el cuadro “Desbloquear” en la parte inferior.

Cuadro de diálogo de propiedades del archivo JAR de Windows :
Cuadro de diálogo Propiedades de archivo JAR de Windows

Estaba usando jruby, en mi caso creé en config / initializers

postgres_driver.rb

 $CLASSPATH < < '~/.rbenv/versions/jruby-1.7.17/lib/ruby/gems/shared/gems/jdbc-postgres-9.4.1200/lib/postgresql-9.4-1200.jdbc4.jar' 

o donde sea que esté tu controlador, ¡y eso es todo!

Además de agregar el conector JDBC de MySQL, asegúrese de que context.xml (si no está desempaquetado en la carpeta de webapps de Tomcat) con sus definiciones de conexión de base de datos se incluyen en el directorio conf de Tomcats.

Tuve este problema exacto al desarrollar una aplicación Spring Boot en STS, pero finalmente implementé la guerra empaquetada en WebSphere (v.9). Basado en respuestas anteriores, mi situación fue única. ojdbc8.jar estaba en mi carpeta WEB-INF / lib con Parent Last class set de carga, pero siempre dice que no pudo encontrar el controlador adecuado.

Mi problema principal era que estaba usando la clase de DataSource incorrecta porque solo estaba siguiendo junto con los tutoriales / ejemplos en línea. Encontré la pista gracias a David Dai. Comente aquí su propia pregunta: Spring JDBC No se pudo cargar la clase de controlador JDBC [oracle.jdbc.driver.OracleDriver]

También más tarde se encontró un ejemplo de Spring Guru con un controlador específico de Oracle: https://springframework.guru/configuring-spring-boot-for-oracle/

Ejemplo que arroja un error utilizando org.springframework.jdbc.datasource.DriverManagerDataSource basado en ejemplos generics.

 @Config @EnableTransactionManagement public class appDataConfig { \* Other Bean Defs *\ @Bean public DataSource dataSource() { // configure and return the necessary JDBC DataSource DriverManagerDataSource dataSource = new DriverManagerDataSource("jdbc:oracle:thin:@//HOST:PORT/SID", "user", "password"); dataSource.setSchema("MY_SCHEMA"); return dataSource; } } 

Y el resultado correcto corregido con oracle.jdbc.pool.OracleDataSource :

 @Config @EnableTransactionManagement public class appDataConfig { /* Other Bean Defs */ @Bean public DataSource dataSource() { // configure and return the necessary JDBC DataSource OracleDataSource datasource = null; try { datasource = new OracleDataSource(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } datasource.setURL("jdbc:oracle:thin:@//HOST:PORT/SID"); datasource.setUser("user"); datasource.setPassword("password"); return datasource; } }