Estoy tratando de agregar una JSP habilitada para base de datos a una aplicación Tomcat 5.5 existente (GeoServer 2.0.0, si eso ayuda).
La aplicación en sí habla con Postgres muy bien, así que sé que la base de datos está activa, el usuario puede acceder a ella, todas esas cosas buenas. Lo que estoy tratando de hacer es una consulta de base de datos en una JSP que he agregado. He usado el ejemplo de configuración en el ejemplo de fuente de datos de Tomcat prácticamente listo para usar . Los taglibs necesarios están en el lugar correcto; no se producen errores si solo tengo las referencias de taglib, por lo que 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 la JSP:
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<sql:query var="rs" dataSource="jdbc/mmas">
select current_validstart as ValidTime from runoff_forecast_valid_time
</sql:query>
La sección relevante de $ CATALINA_HOME / conf / server.xml, dentro de la <Host>
cual está a su vez dentro <Engine>
:
<Context path="/gs2" allowLinking="true">
<Resource name="jdbc/mmas" type="javax.sql.Datasource"
auth="Container" driverClassName="org.postgresql.Driver"
maxActive="100" maxIdle="30" maxWait="10000"
username="mmas" password="very_secure_yess_precious!"
url="jdbc:postgresql//localhost:5432/mmas" />
</Context>
Estas líneas son las últimas en la etiqueta en webapps / gs2 / WEB-INF / web.xml:
<resource-ref>
<description>
The database resource for the MMAS PostGIS database
</description>
<res-ref-name>
jdbc/mmas
</res-ref-name>
<res-type>
javax.sql.DataSource
</res-type>
<res-auth>
Container
</res-auth>
</resource-ref>
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]
fuente
Respuestas:
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
/lib
carpeta del servidor .O, cuando en realidad no está utilizando una fuente de datos de grupo de conexiones administrada por el servidor, pero está manipulando manualmente
DriverManager#getConnection()
en WAR, entonces debe colocar el controlador JDBC en WAR/WEB-INF/lib
y realizar ..... en su código antes de la primera
DriverManager#getConnection()
llamada, por lo que se asegura de no tragar / ignorar ningunoClassNotFoundException
que pueda arrojar y continuar con el flujo del código como si no hubiera ocurrido nada excepcional. Consulte también ¿Dónde tengo que colocar el controlador JDBC para el grupo de conexiones de Tomcat?2. O bien, la URL de JDBC tiene una sintaxis incorrecta
Debe asegurarse de que la URL de JDBC se ajuste a la documentación del controlador JDBC y tenga en cuenta que generalmente distingue entre mayúsculas y minúsculas. Cuando la URL de JDBC no regresa
true
paraDriver#acceptsURL()
ninguno de los controladores cargados, también obtendrá exactamente esta excepción.En el caso de PostgreSQL , está documentado aquí .
En el caso de MySQL , está documentado aquí .
En el caso de Oracle , está documentado aquí .
Ver también:
fuente
Esa URL se ve mal, ¿necesita lo siguiente?
fuente
Olvidé agregar el controlador JDBC de PostgreSQL en mi proyecto ( Mvnrepository ).
Gradle :
Maven :
También puede descargar el JAR e importarlo a su proyecto manualmente.
fuente
Me enfrenté a un 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 algetConnection()
métodoAquí 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()); }
fuente
Encontré el siguiente consejo útil para eliminar este problema en Tomcat:
asegúrese de cargar el controlador primero haciendo un Class.forName ("org.postgresql.Driver"); en su código.
Esto es de la publicación: https://www.postgresql.org/message-id/[email protected]
El código jdbc funcionó bien como programa independiente pero, en TOMCAT, dio el error -'No se encontró un controlador adecuado '
fuente
Vale la pena señalar que esto también puede ocurrir cuando Windows bloquea descargas que considera inseguras. Esto se puede solucionar haciendo clic derecho en el archivo jar (como ojdbc7.jar) y marcando la casilla 'Desbloquear' en la parte inferior.
Cuadro de diálogo Propiedades del archivo JAR de Windows :
fuente
Además de agregar el conector MySQL JDBC, asegúrese de que el context.xml (si no está descomprimido en la carpeta de aplicaciones web de Tomcat) con sus definiciones de conexión de base de datos se incluyan en el directorio conf de Tomcats.
fuente
Un error muy tonto que podría resultar es la adición de espacio al comienzo de la conexión URL de JDBC.
Lo que quiero decir es:-
suponga que ha cometido un error dado la url jdbc como
(Observe que hay un espacio en el inicio de la URL, esto producirá el error)
la forma correcta debería ser:
(Observe que no hay espacio en la mirada fija, puede dar espacio al final de la URL, pero es seguro no hacerlo)
fuente
Estaba usando jruby, en mi caso lo creé bajo config / initializers
postgres_driver.rb
o donde sea que esté su conductor, ¡y eso es todo!
fuente
Tuve este problema exacto al desarrollar una aplicación Spring Boot en STS, pero finalmente implementé la guerra empaquetada en WebSphere (v.9). Según las respuestas anteriores, mi situación era única. ojdbc8.jar estaba en mi carpeta WEB-INF / lib con el conjunto de carga de la última clase principal, pero siempre dice que no pudo encontrar el controlador adecuado.
Mi problema final fue que estaba usando la clase DataSource incorrecta porque solo estaba siguiendo los tutoriales / ejemplos en línea. Encontré la pista gracias al comentario de David Dai sobre su propia pregunta aquí: Spring JDBC No se pudo cargar la clase de controlador JDBC [oracle.jdbc.driver.OracleDriver]
También se encontró más tarde un ejemplo de Spring Guru con controlador específico de Oracle: https://springframework.guru/configuring-spring-boot-for-oracle/
Ejemplo que arroja error usando
org.springframework.jdbc.datasource.DriverManagerDataSource
basado en ejemplos genéricos.Y el ejemplo corregido usando un
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; } }
fuente
Estaba teniendo el mismo problema con la fuente de datos mysql usando datos de primavera que funcionarían afuera, pero me dio este error cuando se implementó en tomcat.
El error desapareció cuando agregué el controlador jar mysql-connector-java-8.0.16.jar a la carpeta jres lib / ext
Sin embargo, no quería hacer esto en producción por temor a interferir con otras aplicaciones. La definición explícita de la clase de controlador resolvió este problema para mí
fuente
Ejecutar
java
conCLASSPATH
la variable de entorno apuntando al archivo JAR del controlador, por ejemplo¿Dónde
drivers/mssql-jdbc-6.2.1.jre8.jar
está la ruta al archivo del controlador (por ejemplo, JDBC para SQL Server )?El
ConnectURL
es la aplicación de ejemplo de que el conductor (samples/connections/ConnectURL.java
), compilado a travésjavac ConnectURL.java
.fuente
En mi caso, estaba trabajando en un proyecto Java con Maven y encontré este error. En su archivo pom.xml asegúrese de tener estas dependencias
y donde creas la conexión tienes algo como esto
fuente
Class.forName
.DriverManager
debería poder encontrarlo.Obtendrá este mismo error si no se proporciona una definición de recurso en algún lugar para su aplicación, probablemente en el context.xml central o en el archivo de contexto individual en conf / Catalina / localhost. Y si utiliza archivos de contexto individuales, tenga en cuenta que Tomcat los elimina libremente cada vez que elimina o anula la implementación del archivo .war correspondiente.
fuente
No importa qué tan antiguo sea este hilo, la gente continuará enfrentándose a este problema.
Mi caso: Tengo la última configuración (en el momento de la publicación) de OpenJDK y maven. Probé todos los métodos dados anteriormente, sin maven e incluso soluciones en publicaciones hermanas en StackOverflow. No estoy usando ningún IDE ni nada más, ejecutándome desde CLI simple para demostrar solo la lógica central.
Esto es lo que finalmente funcionó.
Class.forName(....)
. El archivo que queremos es elcom/mysql/jdbc/Driver.class
java --module-path com/mysql/jdbc -cp ./ App
Esto cargaría el paquete (extraído) manualmente y su programa java encontraría la clase de controlador requerida.
mysql
controlador, otros controladores pueden requerir cambios menores..deb
imagen, puede obtener el frasco en/usr/share/java/your-vendor-file-here.jar
fuente
Encontré este problema al colocar un archivo XML
src/main/resources
incorrectamente, lo eliminé y luego todo volvió a la normalidad.fuente