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