簡體   English   中英

Ubuntu,Java,找不到適合的驅動程序jdbc:postgresql

[英]Ubuntu, Java, No suitable driver found for jdbc:postgresql

我已經創建了一個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>

我已經對其進行了測試,並且可以正常工作,所以我認為錯誤不在此頁面內。

這是我的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();
        }
    }
}

在我的tomcat服務器lib文件夾中,我正在尋找JDBC驅動程序,並且該驅動程序已經存在。 我正在從virtualBox虛擬機運行Ubuntu-18.10-desktop-amd64。

我嘗試將數據庫和用戶名更改為“ 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)

您可能缺少對PostgreSQL JDBC驅動程序的引用。 可能是一個相關的答案 (對於Android OS)。

由於您使用的是ASP.NET,因此可能需要通過此nuget安裝Postgres。

您很可能需要將Postgres添加到您的Java應用程序中,引用:

Mvnrepository中所述,您需要在項目中添加PostgreSQL JDBC驅動程序。

搖籃

// 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>

您還可以下載 JAR並手動將其導入到項目中。

根據JNDI數據源上的Tomcat 8文檔,使用DriverManager加載驅動程序的默認行為是從Apache-Tomcat-Home/lib文件夾中讀取它們。 否則,您將必須明確注冊驅動程序。 它基本上與Tomcat的類加載機制有關。 以下是文檔摘錄:

Apache Tomcat隨附的JRE內存泄漏預防偵聽器通過在Tomcat啟動期間觸發驅動程序掃描來解決此問題。 默認情況下啟用。 這意味着將僅掃描偵聽器可見的庫,例如$ CATALINA_BASE / lib中的庫,以查找數據庫驅動程序。 如果要考慮禁用此功能,請注意,該掃描將由使用JDBC的第一個Web應用程序觸發,從而導致在重新加載此Web應用程序以及其他依賴此功能的Web應用程序時失敗。

因此,在其WEB-INF / lib目錄中具有數據庫驅動程序的Web應用程序不能依賴服務提供程序機制,而應顯式注冊驅動程序。 此行為應適用於較新版本的Tomcat。

此處的關鍵是使用DriverManager查找數據庫驅動程序時的JRE內存泄漏防止偵聽器行為。 根據文檔,此偵聽器:

提供了針對Java運行時環境使用上下文類加載器加載單例的已知位置的變通方法,因為如果Web應用程序類加載器當時恰好是上下文類加載器,則這將導致內存泄漏。 解決方法是在此偵聽器啟動時初始化這些單例,因為Tomcat的公共類加載器當時是上下文類加載器。

但是在您的情況下,我能夠重現該錯誤,Web應用程序類加載器不同於上下文類加載器,因此找不到驅動程序。 因此,解決方案是將偵聽器配置為禁用DriverManager保護-它設置為true的默認值。 您可以通過在Apache-Tomcat-Home/conf/server.xml文件中將driverManagerProtection屬性值設置為false來做到這一點:

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

就是說,我不認為DriverManager是在Web服務器中實例化數據庫連接的正確方法。 數據庫連接很昂貴。 我建議使用DataSource ,它可以池化連接並因此提高性能。 有關示例,請參見提供的文檔鏈接。

但是,我確實相信每種技術都有它的地位。 所以...我將由您自己決定適合您的情況。 但至少,您有答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM