2011-01-28 21 views
7

Tôi đang chạy Mac OSX 10.6 với PostgreSQL 9.0. Tôi đã viết một ứng dụng Java đơn giản chèn một hình ảnh vào một trường bytea và sau đó truy vấn cùng một trường để kiểm tra nó.Điều gì đã thay đổi giữa postgres jdbc 8.4 và 9 liên quan đến bytearrays?

Bảng:

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

Chương trình này là một cái gì đó như:

//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 " + 

      } 

Dưới đây là các sự kiện.

  1. Dùng trình điều khiển postgresql-9.0-801.jdbc4.jar nó hoạt động hoàn hảo cả trong PostgreSQL 8.4 và với PostgreSQL 9

  2. Dùng trình điều khiển 8.4-701.jdbc4 làm việc chỉ trong PostgreSQL 8.4.

  3. Sử dụng trình điều khiển 8.4-701.jdbc4 với PostgreSQL 9 không hoạt động. Tệp được trích xuất khác nhau. Một md5 cho thấy nội dung trong cơ sở dữ liệu bằng với tệp gốc. Do đó, giả định của tôi là vấn đề là trong quá trình trích xuất tệp.

Tôi có thể nâng cấp trình điều khiển, điều đó không thành vấn đề. Mối quan tâm của tôi là: những gì đã thay đổi bên trong giao thức truyền thông không còn được hỗ trợ trong PostgreSQL 9?

Trả lời

10

Mã hóa các mảng byte (cách máy chủ gửi chúng) đã được thay đổi 8,4-9,0:

Xem ghi chú phát hành:
http://www.postgresql.org/docs/9.0/static/release-9-0.html#AEN99255

và các mô tả về cấu hình thiết để biết chi tiết :
http://www.postgresql.org/docs/9.0/static/runtime-config-client.html#GUC-BYTEA-OUTPUT

+0

+1 tks cho câu trả lời của bạn! Tóm lại, trình điều khiển 8.4 đang mong đợi dữ liệu ở chế độ thoát, nhưng PostgreSQL 9 đang gửi nó ở chế độ hex. –

Các vấn đề liên quan