2014-10-09 31 views
3

我正在使用Postgresql 8.4,並且我的應用程序試圖連接到數據庫。 我所註冊的驅動程序:PostgreSQL中的getSchema JDBC驅動拋出java.lang.AbstractMethodError或java.sql.SQLFeatureNotSupportedException

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

,然後嘗試連接:

db = DriverManager.getConnection(database_url); 

(順便說一句,我的JDBC字符串是一樣的東西:JDBC:在PostgreSQL://本地主機:5432/MYSCHEMA?用戶= myuser的&密碼=輸入mypassword)

我已經嘗試了各種版本的JDBC驅動程序,並獲得兩個類型的錯誤:

與JD BC3:

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控制檯常常想對我說..

+0

您使用的驅動程序版本是什麼? jar的文件名包含我使用的版本號 – fvu 2014-10-09 08:59:44

+0

: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和其他幾個版本 – 2014-10-09 09:34:29

+0

請顯示您的測試的完整代碼。另外,你的JVM版本是什麼? – 2014-10-09 10:08:27

回答

4

在Java 7/JDBC 4.1中添加了Connection.getSchema()版本。這意味着它不一定在JDBC 3或4驅動程序中可用(儘管如果實現存在,它將被調用)。

如果使用JDBC 3(爪哇4/5)驅動器或用Java 7或更高是完全可能的一個JDBC 4(爪哇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/上的鏈接顯示的是相當老的版本)。

相關問題