我正在尝试使用jdbc驱动程序从postgres数据库检索blob。它太大了,内存不足,因此我想将其作为下载流式传输。我尝试在ResultSet上使用getBinaryStream方法,但事实证明该方法实际上将所有内容都读取到内存中,因此不适用于大文件。
显然,可以在结果集上使用getBlob方法,并且可以从Blob获取输入流,然后从那里去,但这就是我遇到的问题。
PreparedStatement ps = con.prepareStatement("select data from file_data WHERE ID = ?");
ps.setLong(1,file.fileData.id)
ResultSet rs = ps.executeQuery()
if(rs.next()){
rs.getBlob("data")
那就是我正在运行的代码。当到达最后一行时,它抛出一个错误,我无法理解…
org.postgresql.util.PSQLException:long类型的错误值:xxxxxx
那么“ xxxxxx”就是文件的内容。您可以想象这会花费很长的时间,但实际上并非如此。
我被困在这里。有人对发生的事情有任何想法吗?哎呀,我什至会采用其他方法来下载大型斑点。
我的猜测是,您混合使用了OID和BYTEA样式的Blob。大型二进制对象与Ogre列间接存储在Postgres中。实际的文件数据由Postgres存储在数据库表之外的某个位置。该列仅包含一个对象标识符,该标识符在内部与Blob相关联。例如:
janko=# CREATE TABLE blobtest1 (name CHAR(30), image OID);
CREATE TABLE
janko=# INSERT INTO blobtest1 VALUES ('stackoverflow', lo_import('/tmp/stackoverflow-logo.png'));
INSERT 0 1
janko=# SELECT * FROM blobtest1;
name | image
--------------------------------+-------
stackoverflow | 16389
(1 row)
如果您使用该ResultSet#getBlob(String)
方法,那么应该是OID样式列。getBlob
从列中读取数据并将其转换为Long
。然后,它尝试从其内部存储中读取关联的二进制数据。
另一方面,使用BYTEA,您可以将小的二进制数据直接放入数据库中。例如:
janko=# CREATE TABLE blobtest2 (name CHAR(30), image BYTEA);
CREATE TABLE
janko=# INSERT INTO blobtest2 VALUES ('somebinary', E'\\336\\255\\276\\357\\336\\255\\276\\357');
INSERT 0 1
janko=# SELECT * FROM blobtest2;
name | image
--------------------------------+----------------------------------
somebinary | \336\255\276\357\336\255\276\357
(1 row)
在这里,数据列直接包含二进制数据。如果您尝试getBlob
在这样的列上使用,数据仍会被解释为OID,但显然不会适合Long
。让我们在刚刚创建的数据库上尝试一下:
groovy:000> import java.sql.*
===> [import java.sql.*]
groovy:000> Class.forName("org.postgresql.Driver");
===> class org.postgresql.Driver
groovy:000> db = DriverManager.getConnection("jdbc:postgresql:janko", "janko", "qwertz");
===> org.postgresql.jdbc4.Jdbc4Connection@3a0b2c64
groovy:000> ps = db.prepareStatement("SELECT image FROM blobtest2 WHERE name = ?");
===> SELECT image FROM blobtest2 WHERE name = ?
groovy:000> ps.setString(1, "somebinary")
===> null
groovy:000> rs = ps.executeQuery()
===> org.postgresql.jdbc4.Jdbc4ResultSet@66f9104a
groovy:000> rs.next()
===> true
groovy:000> rs.getBlob("image")
ERROR org.postgresql.util.PSQLException: Bad value for type long : \336\255\276\357\336\255\276\357
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.toLong (AbstractJdbc2ResultSet.java:2796)
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getLong (AbstractJdbc2ResultSet.java:2019)
at org.postgresql.jdbc4.Jdbc4ResultSet.getBlob (Jdbc4ResultSet.java:52)
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getBlob (AbstractJdbc2ResultSet.java:335)
at groovysh_evaluate.run (groovysh_evahtml" target="_blank">luate:3)
...
PostgreSQL JDBC 驱动程序(简称PgJDBC)允许 Java 程序使用标准的,独立于数据库的 Java 代码连接到PostgreSQL 数据库。是用 Pure Java(类型4)编写的开源 JDBC 驱动程序,并以 PostgreSQL 本机网络协议进行通信。 当前版本的驱动程序应与 PostgreSQL 8.2及更高版本以及 Java 6(JDBC 4.0),Java 7(JDBC
问题内容: PostgreSQL:9.3.2 Elasticsearch:0.90 jprante / elasticsearch-river-jdbc:2.2.2 PostgreSQL JDBC:9.3-1100 JDBC 41 我正在尝试使用elasticsearch river将一个postgresql Json数据类型列放入elasticsearch中。 这里是创造的河 河边抱怨说“名称”
我一直在读一些较新的JDBC连接池(如Tomcat)不支持客户端语句池。我已经读到,这是因为大多数JDBC驱动程序都维护自己的语句缓存。然而,我不认为PostgreSQL会发生这种情况。 我说的对吗?如果是这样,我应该使用一个连接池来缓存准备好的语句,以获得最佳的批插入性能吗? 谢谢
探索使用pax-jdbc来管理集成的数据库连池。我遵循了克里斯蒂安·施耐德教程中的步骤。 http://www.liquid-reality.de/display/liquid/2012/01/13/Apache卡拉夫教程第6部分-数据库访问 然而遇到了以下问题, 1) 如果我重新启动containe,pax jdbc不会创建连接池,直到我更新etc目录中的配置文件。不确定我是否错过了任何配置。
主要内容:实例对象可以使用输入和输出流来提供参数数据。能够将整个文件放入可以容纳大值的数据库列,例如和数据类型。 有以下方法可用于流式传输数据 - :此方法用于提供大的ASCII值。 :此方法用于提供较大的UNICODE值。 :此方法用于提供较大的二进制值。 方法除了参数占位符之外还需要额外的参数和文件大小。此参数通知驱动程序使用流向数据库发送多少数据。 实例 考虑要将XML文件上传到数据库表中。下面是XML文