Ubuntu, Java, не найден подходящий драйвер для jdbc: postgresql - PullRequest
0 голосов
/ 27 декабря 2018

Я создал JSP-сервер (tomcat) и связал его с Eclipse IDE.Я также создал сервер PostgreSQL и пытаюсь выяснить, как подключиться к нему через мой JSP-сервер.

Вот как выглядит мой JSP-файл:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <%@ page import="helloWorldJSP.Test" %>
    <%@ page import="helloWorldJSP.SQLTest" %>
</head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
    //Test testThing = new Test();  
    //out.println( testThing.caps("thing") );
    SQLTest test = new SQLTest();
    System.out.println("FINISH");
%>


</body>
</html>

I 'Я проверил его, и он работает, поэтому я не думаю, что ошибка находится на этой странице.

Вот код моего класса SQLTest:

package helloWorldJSP;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class SQLTest 
{
    public SQLTest() 
    {
        Connection conn = null;
        System.out.println("STARTING");

        try 
        {

            String url = "jdbc:postgresql://localhost:5432/deama_db";
            String user = "deama1295";
            String password = "1295";

            conn = DriverManager.getConnection(url, user, password);
            if (conn != null) 
            {
                System.out.println("Connected to the database postgres");
            }
        }
        catch (SQLException ex) 
        {
            System.out.println("An error occurred. Maybe user/password is invalid");
            ex.printStackTrace();
        }
    }
}

В папке lib моего сервера tomcat Iискал драйвер JDBC, и он там.Я запускаю Ubuntu-18.10-desktop-amd64 с виртуальной машины virtualBox.

Я пытался изменить базу данных и имя пользователя на «postgres» (по умолчанию, я считаю?), Но это не изменило мою ошибку(Я почти уверен, что установил пароль для postgres на 1295).

Вот полное сообщение об ошибке:

java.sql.SQLException: No suitable driver found for jdbc:postgresql://localhost/deama_db
    at java.sql.DriverManager.getConnection(DriverManager.java:689)
    at java.sql.DriverManager.getConnection(DriverManager.java:208)
    at helloWorldJSP.SQLTest.<init>(SQLTest.java:26)
    at org.apache.jsp.NewFile_jsp._jspService(NewFile_jsp.java:127)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:476)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:800)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:806)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Согласно документации Tomcat 8 на JNDI Datasources , поведение по умолчанию для загрузки драйверов с использованием DriverManager - это чтение их из папки Apache-Tomcat-Home/lib.В противном случае вам придется явно зарегистрировать драйвер (ы).Это в основном связано с механизмом загрузки классов Tomcat.Вот выдержка из документации:

Слушатель предотвращения утечек памяти JRE, включенный в Apache Tomcat, решает эту проблему, инициируя сканирование драйверов во время запуска Tomcat.Это включено по умолчанию.Это означает, что только библиотеки, видимые для слушателя, такие как библиотеки в $ CATALINA_BASE / lib, будут проверены на наличие драйверов базы данных.Если вы рассматриваете возможность отключения этой функции, обратите внимание, что сканирование будет запускаться первым веб-приложением, использующим JDBC, что приведет к сбоям при перезагрузке этого веб-приложения и других веб-приложений, использующих эту функцию.

Таким образом, веб-приложения, которые имеют драйверы базы данных в своем каталоге WEB-INF / lib, не могут полагаться на механизм поставщика услуг и должны явно регистрировать драйверы.Это поведение должно применяться к более новым версиям Tomcat.

Ключевым моментом здесь является поведение Слушатель предотвращения утечки памяти при поиске драйверов базы данных с использованием DriverManager.Этот слушатель, согласно документации:

предоставляет обходные пути для известных мест, где среда выполнения Java использует загрузчик класса контекста для загрузки одиночного файла, поскольку это вызовет утечку памяти, если класс веб-приложенияВ данный момент loader является загрузчиком класса контекста.Обходной путь - инициализировать эти синглтоны, когда этот слушатель запускается, так как общий загрузчик классов Tomcat является загрузчиком классов контекста в то время.

Но в вашем случае, как в моем случае, я смогПовторно выдавая ошибку, загрузчик класса веб-приложения отличался от загрузчика класса контекста и, следовательно, не нашел драйвер.Поэтому решение состоит в том, чтобы настроить прослушиватель на отключение защиты DriverManager - по умолчанию установлено значение true.Это можно сделать, установив для свойства driverManagerProtection значение false в файле Apache-Tomcat-Home/conf/server.xml:

<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" driverManagerProtection="false"/>

При этом я не верю, что DriverManager является правильным способом создания экземпляра базы данных.соединения в веб-сервере;Соединения с базой данных стоят дорого.Я бы рекомендовал использовать DataSource, который объединяет соединения и, следовательно, улучшает производительность.См. Приведенную ссылку на документацию для примеров.

Однако я верю, что каждая технология имеет свое место.Итак ... Я оставлю это на ваше усмотрение, чтобы решить, что работает в вашем случае.Но, по крайней мере, у вас есть ответ.

0 голосов
/ 27 декабря 2018

Вы, вероятно, пропускаете ссылку на драйвер PostgreSQL JDBC в вашем.Этот может быть релевантным ответом (для ОС Android).

Поскольку вы используете ASP.NET, вам, возможно, потребуется установить Postgres через этот nuget .

Скорее всего, вам нужно добавить Postgres в ваше Java-приложение, цитируя:

Вам необходимо добавить драйвер JDBC PostgreSQL в ваш проект, как указано в 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>

Вы также можете скачать the JAR и импортируйте в свой проект вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...