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

Ste*_*ino 4 postgresql jdbc driver

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

DriverManager.registerDriver(new org.postgresql.Driver());
Run Code Online (Sandbox Code Playgroud)

然后尝试连接:

db = DriverManager.getConnection(database_url);
Run Code Online (Sandbox Code Playgroud)

(顺便说一句,我的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;
Run Code Online (Sandbox Code Playgroud)

使用jdbc4:

java.sql.SQLFeatureNotSupportedException: Il metodo ½org.postgresql.jdbc4.Jdbc4Connection.getSchema()? non Þ stato ancora implementato.
Run Code Online (Sandbox Code Playgroud)

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

我缺少了一些东西,但我不知道..

- - - 解决了 - - - - -

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

db = DriverManager.getConnection(database_url);
LOGGER.info("Connected to : " + db.getCatalog() + " - " + db.getSchema());
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*eel 5

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

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

如果将新方法添加到接口,则只要不调用新方法,仍然可以加载和使用不具有这些方法并且已经针对该接口的较旧版本编译的类。缺少的方法将被简单地引发的代码存根AbstractMethodError。另一方面:如果getSchema 已经实现了一个方法并且签名兼容,那么即使该方法在编译时不存在于接口中,也可以通过该接口访问该方法。

20113月,对该驱动程序进行了更新,以便可以在Java 7(JDBC 4.1)上进行编译,这是通过将新的JDBC 4.1方法与抛出的实现(java.sql.SQLFeatureNotSupportedException包括的实现Connection.getSchema)进行存根处理而实现的。该代码仍在当前的PostgreSQL JDBC驱动程序版本9.3-1102中。从技术上讲,SQLFeatureNotSupportedException除非API文档或JDBC规范明确允许(不允许这样做getSchema),否则不允许抛出JDBC兼容驱动程序。

但是,自今年4月以来,github上的当前代码确实提供了实现。您可能要考虑编译自己的版本,或者在pgsql-jdbc邮件列表上询问是否有可用的最新快照(http://jdbc.postgresql.org/上的快照链接显示的是较旧的版本)。