簡體   English   中英

找不到合適的驅動程序(jdbc:pgsql)

[英]No suitable driver found (jdbc:pgsql)

(使用com.impossibl.postgres.api.jdbc)

當我從hosts文件中引用某些內容時,在建立與數據庫的連接時遇到問題。

它似乎確實可以與“ localhost”一起使用。

Class.forName("com.impossibl.postgres.jdbc.PGDriver");
String url = "jdbc:pgsql://localhost:5432/db";
Connection conn = DriverManager.getConnection(url, "name", "pass");

我有這個在docker容器中運行(與postgres容器在同一主機上)。 當我使用主機IP地址或postgres容器的ip時,它可以正常工作,但是每當我嘗試使用容器名稱時,它都會給我

java.sql.SQLException: No suitable driver found for jdbc:pgsql://postgres_container:5432/db

容器在運行時已鏈接到postgres容器,並且該記錄正好在該容器的hosts文件中。

該驅動程序是否無法引用主機文件? 如果是這樣,為什么它可以與localhost一起使用?

如果它適用於本地主機,但不能使用不同的主機名,那么這聽起來像是該驅動程序中的錯誤,因為它似乎通過返回null來錯誤地拒絕了URL(這對DriverManager表示“此驅動程序無法理解該URL”) ),而不是接受URL並引發SQLException (對於DriverManager ,這意味着“此驅動程序可以理解此URL,但是出了點問題”)(例如語法錯誤,連接問題等)。

如果JDBC驅動程序接受特定的URL格式,則在所有情況下都應從JDBC 4.2第9.2節接受它:

DriverManager嘗試建立連接時,它將調用該驅動程序的connect方法並將該URL傳遞給該驅動程序。 如果驅動程序實現能夠理解URL,則如果無法建立與數據庫的Connection ,它將返回Connection對象或拋出SQLException 如果Driver實現不理解該URL,它將返回null

具體看代碼 ,它看起來像在pgjdbc-NG的URL解析器不喜歡在主機名下划線並為此返回null ,然后使null從返回的Driver拋出來代替SQLException

private static final Pattern URL_PATTERN =
    Pattern.compile("jdbc:pgsql:(?://((?:[a-zA-Z0-9\\-\\.]+|\\[[0-9a-f\\:]+\\])(?:\\:(?:\\d+))?(?:,(?:[a-zA-Z0-9\\-\\.]+|\\[[0-9a-f\\:]+\\])(?:\\:(?:\\d+))?)*)/)?((?:\\w|-|_)+)(?:[\\?\\&](.*))?");

解決方法:使用不帶下划線的主機名或IP地址。

為了解決實際問題,建議您在https://github.com/impossibl/pgjdbc-ng上創建一個問題

在我看來,這聽起來像是與Docker容器配置相關的環境問題。 “ docker”用戶類路徑可能缺少驅動程序目錄,或者docker容器環境未引用該目錄或驅動程序。

我將仔細檢查https://docs.docker.com/engine/examples/postgresql_service/中列出的所有設置,並運行命令行測試等,直到您對其進行跟蹤。

暫無
暫無

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

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