Próbuję dodać stronę JSP z obsługą bazy danych do istniejącej aplikacji Tomcat 5.5 (GeoServer 2.0.0, jeśli to pomaga).
Sama aplikacja dobrze komunikuje się z Postgresem, więc wiem, że baza danych działa, użytkownik ma do niej dostęp i wszystkie te dobre rzeczy. To, co próbuję zrobić, to zapytanie do bazy danych w dodanej przeze mnie stronie JSP. Użyłem przykładu konfiguracji w przykładzie źródła danych Tomcat prawie po wyjęciu z pudełka. Wymagane taglib znajdują się we właściwym miejscu - nie pojawiają się żadne błędy, jeśli mam tylko refs taglib, więc znajduje te pliki JAR. Sterownik postgres jdbc, postgresql-8.4.701.jdbc3.jar, znajduje się w katalogu $ CATALINA_HOME / common / lib.
Oto początek strony 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>
Odpowiednia sekcja z $ CATALINA_HOME / conf / server.xml, wewnątrz <Host>
której znajduje się z kolei w <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>
Te wiersze są ostatnimi w tagu w 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>
Wreszcie wyjątek:
exception
org.apache.jasper.JasperException: Unable to get connection, DataSource invalid: "java.sql.SQLException: No suitable driver"
[...wads of ensuing goo elided]
źródło
Odpowiedzi:
Ten wyjątek może mieć zasadniczo dwie przyczyny:
1. Sterownik JDBC nie jest załadowany
Musisz upewnić się, że sterownik JDBC znajduje się we własnym
/lib
folderze serwera .Lub, gdy w rzeczywistości nie używasz źródła danych puli połączeń zarządzanych przez serwer, ale ręcznie manipulujesz
DriverManager#getConnection()
w WAR, musisz umieścić sterownik JDBC w WAR/WEB-INF/lib
i wykonać ..... w swoim kodzie przed pierwszym
DriverManager#getConnection()
wywołaniem, dzięki czemu upewniasz się, że nie połykasz / nie ignorujesz niczego,ClassNotFoundException
co może zostać przez niego wyrzucone i kontynuujesz przepływ kodu, jakby nic wyjątkowego się nie wydarzyło. Zobacz także Gdzie muszę umieścić sterownik JDBC dla puli połączeń Tomcat?2. Lub adres URL JDBC ma nieprawidłową składnię
Musisz upewnić się, że adres URL JDBC jest zgodny z dokumentacją sterownika JDBC i pamiętaj, że zwykle rozróżnia się wielkość liter. Jeśli adres URL JDBC nie powróci
true
dlaDriver#acceptsURL()
żadnego z załadowanych sterowników, otrzymasz również dokładnie ten wyjątek.W przypadku PostgreSQL jest to udokumentowane tutaj .
W przypadku MySQL jest to udokumentowane tutaj .
W przypadku Oracle jest to udokumentowane tutaj .
Zobacz też:
źródło
Ten adres URL wygląda nieprawidłowo, czy potrzebujesz następujących?
źródło
Zapomniałem dodać sterownik PostgreSQL JDBC do mojego projektu ( Mvnrepository ).
Gradle :
Maven :
Można również pobrać z JAR i importu do projektu ręcznie.
źródło
Zmierzyłem się z podobnym problemem. Mój projekt w kontekście to Dynamic Web Project (Java 8 + Tomcat 8), a błąd dotyczy sterownika PostgreSQL Wyjątek: Nie znaleziono odpowiedniego sterownika
Zostało to rozwiązane przez dodanie
Class.forName("org.postgresql.Driver")
przed wywołaniemgetConnection()
metodyOto mój przykładowy kod:
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()); }
źródło
Poniższa wskazówka okazała się pomocna, aby wyeliminować ten problem w Tomcat -
pamiętaj, aby najpierw załadować sterownik, wykonując Class.forName ("org.postgresql.Driver"); w swoim kodzie.
To jest z postu - https://www.postgresql.org/message-id/[email protected]
Kod jdbc działał dobrze jako samodzielny program, ale w TOMCAT dał błąd - `` Nie znaleziono odpowiedniego sterownika ''
źródło
Warto zauważyć, że może to również wystąpić, gdy system Windows blokuje pobieranie, które uważa za niebezpieczne. Można temu zaradzić, klikając prawym przyciskiem myszy plik jar (na przykład ojdbc7.jar) i zaznaczając pole „Odblokuj” u dołu.
Okno dialogowe Właściwości pliku JAR systemu Windows :
źródło
Oprócz dodania łącznika MySQL JDBC upewnij się, że plik context.xml (jeśli nie został rozpakowany w folderze Tomcat webapps) z definicjami połączeń DB znajduje się w katalogu conf Tomcats.
źródło
Bardzo głupim błędem, który może wyniknąć z dodania spacji na początku połączenia JDBC URL.
Chodzi mi o to że:-
Przypuśćmy, że masz bymistake, podając adres URL jdbc, taki jak
(Zauważ, że w wyglądzie adresu URL jest spacja, spowoduje to błąd)
właściwą drogą powinno być:
(Zauważ, że nie ma spacji w gapieniu się, możesz zostawić spację na końcu adresu URL, ale możesz tego nie robić)
źródło
Używałem jruby, w moim przypadku stworzyłem w config / initializers
postgres_driver.rb
lub gdziekolwiek jest twój kierowca i to wszystko!
źródło
Miałem dokładnie ten problem podczas tworzenia aplikacji Spring Boot w STS, ale ostatecznie wdrażając wojnę pakietową w WebSphere (v.9). Na podstawie poprzednich odpowiedzi moja sytuacja była wyjątkowa. ojdbc8.jar znajdował się w moim folderze WEB-INF / lib z ustawionym ładowaniem klasy Parent Last, ale zawsze mówi, że nie udało się znaleźć odpowiedniego sterownika.
Mój ostateczny problem polegał na tym, że użyłem nieprawidłowej klasy DataSource, ponieważ po prostu śledziłem wraz z samouczkami / przykładami online. Znalazłem podpowiedź dzięki komentarzowi Davida Dai do jego własnego pytania: Spring JDBC Nie można załadować klasy sterownika JDBC [oracle.jdbc.driver.OracleDriver]
Później znaleziono również przykład guru wiosny ze sterownikiem specyficznym dla Oracle: https://springframework.guru/configuring-spring-boot-for-oracle/
Przykład, który zgłasza błąd using
org.springframework.jdbc.datasource.DriverManagerDataSource
na podstawie ogólnych przykładów.I poprawiony przykład przy użyciu
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; } }
źródło
Miałem ten sam problem ze źródłem danych mysql używającym danych wiosennych, które działałyby na zewnątrz, ale dały mi ten błąd po wdrożeniu na tomcat.
Błąd zniknął po dodaniu sterownika jar mysql-connector-java-8.0.16.jar do folderu jres lib / ext
Jednak nie chciałem tego robić w produkcji z obawy przed kolizją z innymi aplikacjami. Wyraźne określenie klasy kierowcy rozwiązało ten problem
źródło
Uruchom
java
zeCLASSPATH
zmienną środowiskową wskazującą na plik JAR sterownika, npGdzie
drivers/mssql-jdbc-6.2.1.jre8.jar
jest ścieżka do pliku sterownika (np. JDBC dla SQL Server ).Jest
ConnectURL
to przykładowa aplikacja z tego sterownika (samples/connections/ConnectURL.java
), skompilowana za pomocąjavac ConnectURL.java
.źródło
W moim przypadku pracowałem nad projektem Java z Mavenem i napotkałem ten błąd. W pliku pom.xml upewnij się, że masz te zależności
a tam, gdzie tworzysz połączenie, masz coś takiego
źródło
Class.forName
.DriverManager
powinien móc go znaleźć.Ten sam błąd wystąpi, jeśli gdzieś nie ma definicji zasobu dla Twojej aplikacji - najprawdopodobniej w centralnym pliku context.xml lub indywidualnym pliku kontekstu w conf / Catalina / localhost. A jeśli używasz indywidualnych plików kontekstowych, uważaj, że Tomcat usuwa je swobodnie za każdym razem, gdy usuniesz / cofniesz wdrożenie odpowiedniego pliku .war.
źródło
Bez względu na to, jak stary jest ten wątek, ludzie nadal będą borykać się z tym problemem.
Mój przypadek: Mam najnowszą (w momencie wysyłania) konfigurację OpenJDK i maven. Wypróbowałem wszystkie metody podane powyżej, bez / poza mavenem, a nawet rozwiązaniami na siostrzanych postach w StackOverflow. Nie używam żadnego IDE ani niczego innego, uruchamiając od samego CLI, aby zademonstrować tylko podstawową logikę.
Oto, co w końcu zadziałało.
Class.forName(....)
. Plik, którego potrzebujemy, tocom/mysql/jdbc/Driver.class
java --module-path com/mysql/jdbc -cp ./ App
Spowoduje to ręczne załadowanie (rozpakowanego) pakietu, a program java znajdzie wymaganą klasę sterownika.
mysql
sterownika, inne sterowniki mogą wymagać drobnych zmian..deb
obraz, możesz zdobyć słoik z/usr/share/java/your-vendor-file-here.jar
źródło
Napotkałem ten problem, umieszczając plik XML w
src/main/resources
niewłaściwym miejscu, usunąłem go i wszystko wróciło do normy.źródło