O infame java.sql.SQLException: Nenhum driver adequado encontrado

89

Estou tentando adicionar um JSP habilitado para banco de dados a um aplicativo Tomcat 5.5 existente (GeoServer 2.0.0, se isso ajudar).

O próprio aplicativo se comunica perfeitamente com o Postgres, então eu sei que o banco de dados está ativo, o usuário pode acessá-lo, todas essas coisas boas. O que estou tentando fazer é uma consulta de banco de dados em um JSP que adicionei. Eu usei o exemplo de configuração no exemplo da fonte de dados Tomcat praticamente pronto para uso. Os taglibs necessários estão no lugar certo - nenhum erro ocorrerá se eu tiver apenas os refs do taglib, então é encontrar esses JARs. O driver jdbc postgres, postgresql-8.4.701.jdbc3.jar está em $ CATALINA_HOME / common / lib.

Aqui está o topo do 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>

A seção relevante de $ CATALINA_HOME / conf / server.xml, dentro do <Host>que por sua vez está dentro de <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 linhas são as últimas na tag em 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, a exceção:

   exception
    org.apache.jasper.JasperException: Unable to get connection, DataSource invalid: "java.sql.SQLException: No suitable driver"
    [...wads of ensuing goo elided]
Rick Wayne
fonte
Veja minha resposta: stackoverflow.com/a/38656446/632951
Pacerier

Respostas:

106

O infame java.sql.SQLException: Nenhum driver adequado encontrado

Essa exceção pode ter basicamente duas causas:

1. O driver JDBC não está carregado

Você precisa garantir que o driver JDBC seja colocado na própria /libpasta do servidor .

Ou, quando você realmente não está usando uma fonte de dados de pool de conexão gerenciada pelo servidor, mas está mexendo manualmente DriverManager#getConnection()no WAR, você precisa colocar o driver JDBC no WAR /WEB-INF/libe executar.

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

.. em seu código antes da primeira DriverManager#getConnection()chamada, por meio da qual você se certifica de não engolir / ignorar qualquer coisa ClassNotFoundExceptionque possa ser gerada por ela e continuar o fluxo de código como se nada de excepcional tivesse acontecido. Consulte também Onde devo colocar o driver JDBC para o pool de conexão do Tomcat?

2. Ou o URL JDBC está na sintaxe errada

Você precisa se certificar de que o URL JDBC está em conformidade com a documentação do driver JDBC e lembre-se de que geralmente diferencia maiúsculas de minúsculas. Quando o URL JDBC não retorna truepara Driver#acceptsURL()nenhum dos drivers carregados, você também obterá exatamente esta exceção.

No caso do PostgreSQL, ele é documentado aqui .

Com o JDBC, um banco de dados é representado por um URL (Uniform Resource Locator). Com o PostgreSQL ™, isso assume uma das seguintes formas:

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

No caso do MySQL, ele está documentado aqui .

O formato geral de um URL JDBC para conexão com um servidor MySQL é o seguinte, com os itens entre colchetes ( [ ]) sendo opcionais:

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

No caso do Oracle, ele está documentado aqui .

Existem 2 sintaxe de URL, a sintaxe antiga que só funcionará com SID e a nova com o nome do serviço Oracle.

Sintaxe antiga jdbc:oracle:thin:@[HOST][:PORT]:SID

Nova sintaxe jdbc:oracle:thin:@//[HOST][:PORT]/SERVICE


Veja também:

BalusC
fonte
Obrigado rapazes! Desculpe, a primeira tentativa não foi em OP, apenas jdbc: postgresql: mmas (e eu tentei outros!). Infelizmente, com o URL de araqnid, o mesmo resultado. Ontem à noite troquei coisas do tablib por (ick) Java embutido, e isso funciona bem: tente {Class.forName ("org.postgresql.Driver"). NewInstance (); con = DriverManager.getConnection ("jdbc: postgresql: mmas", "mmas", "passwd"); stmt = con.createStatement (); rs = stmt.executeQuery ("selecionar yada yada"); if (rs! = null && rs.next ()) {// colher fama, fortuna, glória, babes O exemplo de Jacarta foi com taglibs, então comecei assim.
Rick Wayne
Ah. Comentários nem tanto com a formatação do código. Ahem. Meu novato está aparecendo? (ZIIP!) De qualquer forma, o exemplo de Jakarta foi todo sobre o uso da sintaxe <sql: query> em vez de apenas incorporar o código Java, e eu concordo que é uma maneira muito mais limpa de fazer isso. Não se deve precisar chamar explicitamente forName () e getConnection (), certo? Mas o antigo e feio método hackear o código do driver na camada de apresentação funcionou muito bem, primeiro tente. Portanto, estou perplexo, mas agora é mais uma questão de manutenção / estética do que "Isso está quebrado, conserte ou aprimore suas habilidades de virar hambúrguer"
Rick Wayne
IMHO usando o taglib sql é apenas um pouco melhor do que fazer JDBC em scriptlets ... prefere um padrão de controlador / visualização onde o db é feito antecipadamente e o JSP apenas exibe o material. No entanto, cada um com o seu próprio, e usar sql: query mantém as coisas simples :) (ish)
araqnid
Nunca disse que concordo com o uso de taglib JSTL SQL, mas esse não é o assunto deste tópico.
BalusC de
2
Obrigado, seus formatos de string de conexão JDBC foram extremamente úteis!
Jay Taylor
15
url="jdbc:postgresql//localhost:5432/mmas"

Esse URL parece errado. Você precisa do seguinte?

url="jdbc:postgresql://localhost:5432/mmas"
araqnid
fonte
15

Esqueci de adicionar o driver JDBC PostgreSQL ao meu projeto ( Mvnrepository ).

Gradle :

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

Maven :

<dependency>
    <groupId>postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>9.0-801.jdbc4</version>
</dependency>

Você também pode baixar o JAR e importar para o seu projeto manualmente.

Manuel Schmitzberger
fonte
12

Eu enfrentei um problema semelhante. Meu projeto no contexto é Dynamic Web Project (Java 8 + Tomcat 8) e o erro é para exceção do driver PostgreSQL: Nenhum driver adequado encontrado

Foi resolvido adicionando Class.forName("org.postgresql.Driver")antes de chamar o getConnection()método

Aqui está meu código de amostra:

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());
        }
Vinayak Singh
fonte
3

Achei a dica a seguir útil para eliminar esse problema no Tomcat -

certifique-se de carregar o driver primeiro fazendo um Class.forName ("org.postgresql.Driver"); em seu código.

Isso é da postagem - https://www.postgresql.org/message-id/[email protected]

O código jdbc funcionou bem como um programa autônomo, mas, no TOMCAT, apresentou o erro -'Nenhum driver adequado encontrado '

Um Venkatraman
fonte
Não há links, apenas respostas - descreva brevemente o que está por trás disso!
monamona
Um link para uma solução é bem-vindo, mas certifique-se de que sua resposta seja útil sem ele: adicione contexto ao link para que seus outros usuários tenham uma ideia do que ele é e por que está lá, depois cite a parte mais relevante da página que você ' novo link para caso a página de destino não esteja disponível. Respostas que são pouco mais do que um link podem ser excluídas .
Peter
1

É importante observar que isso também pode ocorrer quando o Windows bloqueia downloads que ele considera inseguros. Isso pode ser resolvido clicando com o botão direito do mouse no arquivo jar (como ojdbc7.jar) e marcando a caixa 'Desbloquear' na parte inferior.

Caixa de diálogo de propriedades do arquivo JAR do Windows :
Diálogo de Propriedades do Arquivo JAR do Windows

user7994072
fonte
1

Além de adicionar o conector JDBC do MySQL, certifique-se de que o context.xml (se não estiver descompactado na pasta Tomcat webapps) com suas definições de conexão de banco de dados esteja incluído no diretório Tomcats conf.

feistyfawn
fonte
1

Um erro muito bobo que poderia resultar é adicionar espaço no início da conexão de URL JDBC.

O que eu quero dizer é:-

Suponha que você cometeu um erro ao fornecer o URL jdbc como

String jdbcUrl=" jdbc:mysql://localhost:3306/web_customer_tracker?useSSL=false&serverTimeZone=UTC";

(Observe que há um espaço no início da url, isso causará o erro)

a maneira correta deve ser:

String jdbcUrl="jdbc:mysql://localhost:3306/web_customer_tracker?useSSL=false&serverTimeZone=UTC";

(Observe que não há espaço no início, você pode dar espaço no final do url, mas é seguro não fazê-lo)

ankkol2011
fonte
0

Eu estava usando o jruby, no meu caso criei em 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'

ou onde quer que esteja o seu motorista, e pronto!

Ale Guro
fonte
0

Tive exatamente esse problema ao desenvolver um aplicativo Spring Boot em STS, mas, no final das contas, ao implantar o war empacotado no WebSphere (v.9). Com base nas respostas anteriores, minha situação era única. ojdbc8.jar estava em minha pasta WEB-INF / lib com o carregamento de classe Parent Last definido, mas sempre diz que falhou ao encontrar o driver adequado.

Meu problema final era que eu estava usando a classe DataSource incorreta porque estava apenas acompanhando tutoriais / exemplos online. Encontrou a dica graças ao comentário de David Dai sobre sua própria pergunta aqui: Spring JDBC Não foi possível carregar a classe de driver JDBC [oracle.jdbc.driver.OracleDriver]

Mais tarde, também encontrei o exemplo do Spring Guru com o driver específico da Oracle: https://springframework.guru/configuring-spring-boot-for-oracle/

Exemplo que gera erro usando com org.springframework.jdbc.datasource.DriverManagerDataSourcebase em exemplos genéricos.

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

E o exapmle corrigido usando um 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;
    }
}
Ryan D
fonte
0

Eu estava tendo o mesmo problema com a fonte de dados mysql usando dados de primavera que funcionariam fora, mas me deu este erro quando implantado no tomcat.

O erro desapareceu quando adicionei o driver jar mysql-connector-java-8.0.16.jar à pasta jres lib / ext

Porém, não queria fazer isso na produção por medo de interferir em outros aplicativos. A definição de clareza da classe do driver resolveu esse problema para mim

    spring.datasource.driver-class-name: com.mysql.cj.jdbc.Driver
Entalhe
fonte
0

Execute javacom CLASSPATHa variável ambiental apontando para o arquivo JAR do driver, por exemplo

CLASSPATH='.:drivers/mssql-jdbc-6.2.1.jre8.jar' java ConnectURL

Onde drivers/mssql-jdbc-6.2.1.jre8.jarestá o caminho para o arquivo do driver (por exemplo, JDBC para SQL Server ).

Este ConnectURLé o aplicativo de amostra desse driver ( samples/connections/ConnectURL.java), compilado por meio de javac ConnectURL.java.

Kenorb
fonte
0

No meu caso, eu estava trabalhando em um projeto Java com Maven e encontrei este erro. Em seu arquivo pom.xml, certifique-se de ter essas dependências

<dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.11</version>
    </dependency>
  </dependencies>

e onde você cria conexão tem algo assim

public Connection createConnection() {
        try {
            String url = "jdbc:mysql://localhost:3306/yourDatabaseName";
            String username = "root"; //your my sql username here
            String password = "1234"; //your mysql password here

            Class.forName("com.mysql.cj.jdbc.Driver");
            return DriverManager.getConnection(url, username, password);
        } catch (SQLException | ClassNotFoundException e) {
            e.printStackTrace();
        }

        return null;
    }
Justice Bringer
fonte
Você não deveria precisar ligar Class.forName. DriverManagerdeve ser capaz de encontrá-lo.
Stephen C
Tu podes estar certo. Java não é minha principal linguagem de codificação.
Justice Bringer
0

Você obterá o mesmo erro se não houver uma definição de Recurso fornecida em algum lugar para seu aplicativo - provavelmente no context.xml central ou no arquivo de contexto individual em conf / Catalina / localhost. E se estiver usando arquivos de contexto individuais, tome cuidado para que o Tomcat os exclua livremente sempre que você remover / desimplantar o arquivo .war correspondente.

em_bo
fonte
0

Não importa quantos anos este tópico se torne, as pessoas continuarão a enfrentar esse problema.

Meu caso: Eu tenho a configuração mais recente (no momento da postagem) do OpenJDK e do maven. Eu tentei todos os métodos fornecidos acima, sem maven e até mesmo soluções em publicações irmãs no StackOverflow. Não estou usando nenhum IDE ou qualquer outra coisa, executando a partir de CLI nua para demonstrar apenas a lógica principal.

Aqui está o que finalmente funcionou.

  • Baixe o driver do site oficial. (para mim era MySQL https://www.mysql.com/products/connector/ ). Use seu sabor aqui.
  • Descompacte o arquivo jar fornecido no mesmo diretório do seu projeto java. Você obteria uma estrutura de diretório como esta. Se você olhar com atenção, isso se relaciona exatamente com o que tentamos fazer usando Class.forName(....). O arquivo que queremos é ocom/mysql/jdbc/Driver.class

https://i.imgur.com/VgpwatQ.png

  • Compile o programa java que contém o código.
javac App.java
  • Agora carregue o direcionador como um módulo executando
java --module-path com/mysql/jdbc -cp ./ App

Isso carregaria o pacote (extraído) manualmente e seu programa java encontraria a classe de driver necessária.


  • Observe que isso foi feito para o mysqldriver; outros drivers podem exigir pequenas alterações.
  • Se o seu fornecedor fornecer uma .debimagem, você pode obter o frasco em/usr/share/java/your-vendor-file-here.jar
Yash Kumar Verma
fonte
-1

Encontrei esse problema inserindo um arquivo XML src/main/resourcesincorretamente, excluí-o e tudo voltou ao normal.

Jerryleooo
fonte