使用Java / Scala存储/检索BYTEA和BLOB:“java.sql.SQLFeatureNotSupportedException”

时间:2014-06-25 20:36:44

标签: java postgresql scala jdbc

情况如下:我试图在PostgreSQL数据库中存储/检索byte []数组和BLOBS。

我使用Scala Play和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()
}
} 

其中'图像' column的类型为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完全死了,我应该切换到其他一些数据库? 使用Postgres与Java在某种程度上是一个坏主意吗? 在某种程度上我的postgres版本是9.3但是我使用的是JDBC 9.1-x?

如果有人告诉我我做错了什么以及如何让它发挥作用,我将非常感激。

PS: ...尝试git-clone pgjdbc。它需要ant 1.4.1来构建。这个蚂蚁版本已经有8年的历史了,不再在Apache基金会的网站上提供。难道不是很怪异吗?

2 个答案:

答案 0 :(得分:2)

这似乎是最新的,不是吗?

" org.postgresql" %" postgresql" %" 9.3-1100-jdbc41"

答案 1 :(得分:2)

解决方案结果相当简单:

  • 直接从项目页面下载最新版本的JDBC驱动程序:

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

  • 在play项目的根文件夹中创建'lib'目录,只需将jar放在那里。
  • 从build.sbt脚本中删除依赖项。

所以,问题是Maven存储库中最新的东西已经过时且出现故障:这只是一个分发问题。做一个例外,手动管理这个依赖,然后它应该工作。

编辑:另一个答案要好得多。