Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 未找到合适的驱动程序(jdbc:pgsql)_Java_Networking_Jdbc_Docker - Fatal编程技术网

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

Java 未找到合适的驱动程序(jdbc:pgsql),java,networking,jdbc,docker,Java,Networking,Jdbc,Docker,(使用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, "nam

(使用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一起工作?

这听起来像是一个与docker容器配置相关的环境问题。“docker”用户类路径可能缺少驱动程序目录,或者docker容器环境未引用该目录或驱动程序

我会再次检查中列出的所有设置
然后运行命令行测试等,直到找到它。

如果它与localhost一起工作,但不是与其他主机名一起工作,那么它听起来像是驱动程序中的一个错误,因为它似乎错误地拒绝了URL,返回了
null
(这对于
DriverManager
意味着,“此驱动程序不理解此URL”)而不是接受URL并抛出一个
SQLException
(这对于
DriverManager
意味着,“这个驱动程序理解这个URL,但有点不对劲”(例如语法错误、连接问题等)

如果JDBC驱动程序接受特定的URL格式,那么它在任何情况下都应该接受,见JDBC 4.2第9.2节:

DriverManager
尝试建立连接时,它调用该驱动程序的connect方法并向驱动程序传递URL。如果驱动程序实现理解URL,它将返回
连接
对象,或者在无法与数据库建立连接时抛出
SQLException
。如果
驱动程序实现不理解URL,它将返回
null

具体来看,pgjdbc ng中的URL解析器似乎不喜欢主机名中的下划线,因此返回
null
,这会导致
null
驱动程序返回,而不是抛出
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地址


为了解决实际问题,我建议您在

上创建一个问题,如果我运行“getent hosts localhost | awk'{print$1}'”,如果得到结果,如果我传递容器名称而不是localhost,则相同。此外,如果我在本地运行程序并手动设置某些内容(而不是localhost),则我不认为这是docker相关的问题在hosts文件中,我得到了相同的错误。看起来驱动程序没有读取hosts文件或其他内容。