关于bytearrays的postgres jdbc 8.4和9之间有什么变化?

时间:2011-01-28 12:35:13

标签: java postgresql jdbc

我正在使用PostgreSQL 9.0运行Mac OSX 10.6。我写了一个简单的Java应用程序,它在一个bytea字段中插入一个图像,然后查询同一个字段来检查它。

表格:

 CREATE TABLE test.test_table
   (
   id integer NOT NULL,
  image bytea,
  CONSTRAINT test_table_pkey PRIMARY KEY (id)
);

该计划类似于:

//insert the file
    PreparedStatement ps = connection.prepareStatement("INSERT INTO test.test_table( id, image ) VALUES (?, ?);");
            byte[] bytesFromFile = readFile("img/test1.bmp");
            ps.setInt(1, 1);
            ps.setBytes(2, bytesFromFile);
            ps.execute();
            ps.close();

            PreparedStatement stmt = connection.prepareStatement("Select id,image from test.test_table");
            ResultSet rs = stmt.executeQuery();
    //Get the file from the BD  and save it to the FS 
            while (rs.next()) {
                String id = rs.getString(1);
                InputStream imageStream = rs.getBinaryStream(2);
                String imageName = OUTPUT_DIR + "/" + id + ".bmp";
                FileOutputStream f = new FileOutputStream(imageName);
                byte buff[] = new byte[1024];
                int l;
                while ((l = imageStream.read(buff)) > 0) {
                    f.write(buff, 0, l);
                }
                f.close();
                System.out.println("CREATED : " + imageName);// + " size " +

            }

以下是事实。

  1. 使用驱动程序 postgresql-9.0-801.jdbc4.jar它 两者都很完美 PostgreSQL 8.4和PostgreSQL 9

  2. 使用驱动程序8.4-701.jdbc4有效 仅在PostgreSQL 8.4中。

  3. 使用 驱动程序8.4-701.jdbc4与PostgreSQL 9不起作用。提取的文件不同。 md5表示数据库中的内容等于原始文件。因此,我的假设是问题是在提取文件期间。
  4. 我可以升级驱动程序,没问题。我担心的是:PostgreSQL 9中不再支持的通信协议内部发生了哪些变化?

1 个答案:

答案 0 :(得分:10)

字节数组的编码(服务器发送它们的方式)已从8.4更改为9.0:

请参阅发行说明:
http://www.postgresql.org/docs/9.0/static/release-9-0.html#AEN99255

以及详细说明的配置设置说明:
http://www.postgresql.org/docs/9.0/static/runtime-config-client.html#GUC-BYTEA-OUTPUT