Java 未找到合适的驱动程序(jdbc:pgsql)
(使用com.impossibl.postgres.api.jdbc) 当我引用hosts文件中的内容时,我在建立到数据库的连接时遇到问题 不过,它似乎与“localhost”配合使用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
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文件或其他内容。