PostgreSQL中的getSchema JDBC驱动程序抛出java.lang.AbstractMethodError或java.sql.SQLFeatureNotSupportedException

时间:2014-10-09 08:58:00

标签: postgresql jdbc driver

我正在使用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控制台经常试图对我说..

1 个答案:

答案 0 :(得分:4)

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

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

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

March 2011中,驱动程序已更新,因此可以在Java 7(JDBC 4.1)上进行编译,这可以通过使用抛出java.sql.SQLFeatureNotSupportedException的实现来存储新的JDBC 4.1方法来实现,包括{ {3}}。此代码仍在当前的PostgreSQL JDBC驱动程序版本9.3-1102中。从技术上讲,不允许JDBC兼容的驱动程序抛出SQLFeatureNotSupportedException,除非API文档或JDBC规范明确允许它(它不适用于getSchema)。

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