jdbc.postgresql 驱动程序说它是纯 java 且与平台无关:
PostgreSQL® JDBC 驱动程序(简称 pgJDBC)允许 Java 程序 使用独立于数据库的标准连接到 PostgreSQL® 数据库 Java代码。是一个用纯Java编写的开源JDBC驱动程序(类型 4),并以 PostgreSQL® 本机网络协议进行通信。 因此,驱动程序是独立于平台的;一旦编译, 该驱动程序可以在任何系统上使用。
这看起来很棒。但是当我将 clojure 应用程序放入 docker 容器中时,jdbc posgresql 失败了:
org.postgresql.util.PSQLException: ERROR: could not load library "/usr/lib/postgresql/13/lib/llvmjit.so": /lib/x86_64-
linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.30' not found (required by /lib/x86_64-linux-gnu/libz3.so.4)
QueryExecutorImpl.java:2713 org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse
QueryExecutorImpl.java:2401 org.postgresql.core.v3.QueryExecutorImpl.processResults
QueryExecutorImpl.java:368 org.postgresql.core.v3.QueryExecutorImpl.execute
PgStatement.java:498 org.postgresql.jdbc.PgStatement.executeInternal
PgStatement.java:415 org.postgresql.jdbc.PgStatement.execute
PgPreparedStatement.java:190 org.postgresql.jdbc.PgPreparedStatement.executeWithFlags
PgPreparedStatement.java:134 org.postgresql.jdbc.PgPreparedStatement.executeQuery
jdbc.clj:1090 clojure.java.jdbc/execute-query-with-params
jdbc.clj:1084 clojure.java.jdbc/execute-query-with-params
jdbc.clj:1113 clojure.java.jdbc/db-query-with-resultset*
jdbc.clj:1093 clojure.java.jdbc/db-query-with-resultset*
jdbc.clj:1182 clojure.java.jdbc/query
jdbc.clj:1144 clojure.java.jdbc/query
jdbc.clj:1160 clojure.java.jdbc/query
如果 JDBC 驱动程序应该是纯 java 的,为什么它要尝试查找一些非 java 共享库?为什么它专门尝试加载 postgresql 13 共享对象库(我的系统只有 postgresql-15)?
JDBC postgres 驱动程序文档没有骗你。该错误是来自 postgres 服务器本身,而不是来自 JIT 驱动程序。整个 postgres 安装已损坏(例如,尝试从命令行运行
psql
工具,您将收到相同的错误)。
您的问题中没有足够的详细信息来提示您如何解决该错误。然而,实际的问题是:“为什么 postgres JDBC 驱动程序需要这个‘非 java 共享库’”,答案是:它不需要那个库;它不需要这个库。不过你的 postgres 服务器确实如此。