(使用com.impossibl.postgres.api.jdbc)
当我从hosts文件中引用某些内容时,我在建立与数据库的连接时出现问题。
它似乎适用于本地主机'虽然。
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文件中。就像它应该的那样。
此驱动程序无法引用hosts文件吗?如果是这样,为什么它适用于localhost?
答案 0 :(得分:2)
如果它适用于localhost,但没有使用不同的主机名,那么这听起来像是该驱动程序中的一个错误,因为它似乎错误地拒绝了该网址,返回null
(DriverManager
表示,"此驱动程序无法理解此网址")而不是接受网址并抛出SQLException
(DriverManager
表示,"此驱动程序理解此URL,但有些错误"(例如语法错误,连接问题等)。
如果JDBC驱动程序接受特定的URL格式,它应该在所有情况下接受它,从JDBC 4.2第9.2节开始:
当
DriverManager
尝试建立连接时,它会调用该驱动程序的connect方法并将驱动程序传递给URL。如果Driver实现了解URL,则它将返回Connection
对象,或者如果无法将连接发送到数据库,则抛出SQLException
。如果Driver
实施不理解该网址,则会返回null
。
特别关注the code,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
上创建一个问题答案 1 :(得分:0)
这听起来像是与docker容器配置相关的环境问题。 "码头工具" user classpath可能缺少驱动程序目录,或者docker容器环境不引用目录或驱动程序。
我会仔细检查所列的所有设置 https://docs.docker.com/engine/examples/postgresql_service/并运行命令行测试等,直到您将其追踪为止。