找不到合适的驱动程序(jdbc:pgsql)

时间:2016-07-08 22:29:08

标签: java networking jdbc docker

(使用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?

2 个答案:

答案 0 :(得分:2)

如果它适用于localhost,但没有使用不同的主机名,那么这听起来像是该驱动程序中的一个错误,因为它似乎错误地拒绝了该网址,返回nullDriverManager表示,"此驱动程序无法理解此网址")而不是接受网址并抛出SQLExceptionDriverManager表示,"此驱动程序理解此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/并运行命令行测试等,直到您将其追踪为止。