[英]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.