【问题标题】:getSchema in PostgreSQL JDBC driver throws java.lang.AbstractMethodError or java.sql.SQLFeatureNotSupportedExceptionPostgreSQL JDBC 驱动程序中的 getSchema 抛出 java.lang.AbstractMethodError 或 java.sql.SQLFeatureNotSupportedException
【发布时间】:2014-12-04 03:23:19
【问题描述】:

我正在使用 Postgresql 8.4,我的应用程序正在尝试连接到数据库。 我已经注册了驱动:

DriverManager.registerDriver(new org.postgresql.Driver());

然后尝试连接:

db = DriverManager.getConnection(database_url);

(顺便说一句,我的 jdbc 字符串类似于:jdbc:postgresql://localhost:5432/myschema?user=myuser&password=mypassword)

我尝试了各种版本的 jdbc 驱动程序并得到两种类型的错误:

使用 jdbc3:

Exception in thread "main" java.lang.AbstractMethodError: org.postgresql.jdbc3.Jdbc3Connection.getSchema()Ljava/lang/String;

使用 jdbc4:

java.sql.SQLFeatureNotSupportedException: Il metodo ½org.postgresql.jdbc4.Jdbc4Connection.getSchema()╗ non Þ stato ancora implementato.

这意味着:方法 org.postgresql.jdbc4.Jdbc4Connection.getSchema() 尚未实现。

我错过了一些东西,但我不知道是什么..

-------- 已解决 ---------

问题不在于连接字符串或驱动程序版本,问题在于getConnection()方法正上方的代码:

db = DriverManager.getConnection(database_url);
LOGGER.info("Connected to : " + db.getCatalog() + " - " + db.getSchema());

似乎 postgresql 驱动程序没有 getSchema 方法,因为 java 控制台经常试图对我说..

【问题讨论】:

  • 您使用的驱动程序是什么版本? jar 的文件名包含版本号
  • 我用过:8.4-702.jdbc3、8.4-702.jdbc4、9.2-1002.jdbc3、9.2-1002.jdbc4、9.2-1003.jdbc3、9.2-1003.jdbc4、9.3 -1102.jdbc3、9.3-1102.jdbc4 可能还有其他几个版本
  • 请显示您的测试的完整代码。另外,你的 JVM 版本是多少?
  • 关于 cmets 讨论后的简短版本 - 与 Class.forName 相同的错误。使用 JDK 1.7。所以我认为你的类路径有多个不兼容的 PgJDBC 版本(可能嵌套在其他 jars 中?)或者其他东西被严重破坏了。我需要查看一个独立的测试用例来进一步帮助您。
  • 现在我使用的是 9.3-1102-jdbc41,但我认为现在我已经删除了有问题的方法( db.getSchema() ),它也可以与其他版本一起使用。 Java 版本 7。

标签: postgresql jdbc driver


【解决方案1】:

Connection.getSchema() 版本是在 Java 7 / JDBC 4.1 中添加的。这意味着它不一定在 JDBC 3 或 4 驱动程序中可用(尽管如果存在实现,它将被调用)。

如果您在 Java 7 或更高版本中使用 JDBC 3 (Java 4/5) 驱动程序或 JDBC 4 (Java 6) 驱动程序,则完全有可能在调用 getSchema 时收到 java.lang.AbstractMethodError,如果它 在实现中不存在。 Java 为实现接口的类提供了一种前向兼容性。

如果向接口添加了新方法,则没有这些方法的类——例如——针对旧版本的接口编译的类,仍然可以加载和使用,前提是不调用新方法。缺少的方法将被简单地抛出 AbstractMethodError 的代码存根。另一方面:如果方法getSchema已实现并且签名兼容,则该方法现在可以通过接口访问,即使该方法在编译时接口中不存在。

March 2011 中,驱动程序已更新,因此它可以在 Java 7 (JDBC 4.1) 上编译,这是通过将新的 JDBC 4.1 方法与引发 java.sql.SQLFeatureNotSupportedException 的实现存根来实现的,包括 the implementation of Connection.getSchema。此代码仍在当前的 PostgreSQL JDBC 驱动程序版本 9.3-1102 中。从技术上讲,不允许 JDBC 兼容的驱动程序抛出 SQLFeatureNotSupportedException,除非 API 文档或 JDBC 规范明确允许(getSchema 不允许)。

然而,github 上的 current code 确实提供了一个实现 since April this year。您可能需要考虑编译自己的版本,或者在 pgsql-jdbc 邮件列表中询问是否有可用的最新快照(http://jdbc.postgresql.org/ 上的快照链接显示了相当旧的版本)。

【讨论】:

    猜你喜欢
    • 2013-10-25
    • 2015-09-21
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 2015-05-06
    • 2014-06-26
    • 1970-01-01
    相关资源
    最近更新 更多