2014-06-25 66 views
2

情況如下:我試圖在PostgreSQL數據庫中存儲/檢索byte []數組和BLOBS。使用Java/Scala存儲/檢索BYTEA和BLOB:「java.sql.SQLFeatureNotSupportedException」

我使用斯卡拉與ANORM播放,但對於BYTEA處理和BLOB的我已經迴歸到使用普通的舊java.sql.Connection中的API和大致遵循這樣的描述:

http://jdbc.postgresql.org/documentation/80/binary-data.html

我代碼如下:

def saveSmallImage(id: String, img: SmallImage): Unit = { 
    DB.withConnection { implicit conn => 

    val ps = conn.prepareStatement(
    "INSERT INTO SmallImage(id, mimeType, image) VALUES (?, ?, ?)") 
    ps.setString(1, id) 
    ps.setString(2, img.mimeType) 
    ps.setBinaryStream(3, img.binaryStream, img.length) 
    ps.executeUpdate() 
    ps.close() 
} 
} 

其中'image'列是BYTEA類型,img.binaryStream是InputStream類型。

我得到這個錯誤:

java.sql.SQLFeatureNotSupportedException: Method 
org.postgresql.jdbc4.Jdbc4PreparedStatement. 
    setBinaryStream(int, InputStream, long) 
is not yet implemented. 

我在build.sbt以下依賴性:

"postgresql" % "postgresql" % "9.1-901-1.jdbc4" 

(此對應的groupId,artifactId的,版本的Maven POM-文件)。這似乎是最近的一次。 Postgres手冊告訴我,自從PostgreSQL 7.2版以來,這個特性一直存在。

發生了什麼事? PostgreSQL/JDBC以某種方式被棄用,不再維護? 我應該採取另一個版本,使其工作? 或者SQL完全死了,我應該切換到其他數據庫? 在Java中使用Postgres是不是總是一個壞主意? 難道它不知道我的postgres版本是9.3,但我使用JDBC 9.1-x?

如果有人告訴我我做錯了什麼以及如何使它工作,我將非常感激。

PS: ...試圖git-clone pgjdbc。它需要ant 1.4.1來構建。這個ant版本大約8歲,不再可以在Apache基金會的網站上找到。這是不是有點怪誕?

回答

2

這似乎是更新的一個,不是?

「org.postgresql」 % 「PostgreSQL的」 % 「9.3-1100-jdbc41」

+1

是的,這也適用,這比我的建議好得多! 我剛剛搜索了錯誤的groupId,在groupId =「postgresql」下面只有不推薦的東西不起作用......但「org.postgresql」包含最新的東西,現在一切正常。 謝謝。 –

+0

不客氣,成功與Postgres和Scala :) – Ashalynd

2

該解決方案被證明是相當瑣碎:

  • 直接下載最新的JDBC驅動程序的版本從項目頁面:

http://jdbc.postgresql.org/download.html

  • CR在播放項目的根文件夾中放置'lib'目錄,只需將該jar放在那裏即可。
  • 從build.sbt腳本中刪除依賴項。

所以,問題是,在Maven倉庫中最新的東西已經過時和故障:這只是一個分配問題。做一個例外,手動管理這個依賴關係,然後它應該工作。

編輯:其他答案好多了。