PostgreSQLcung cấp hai Những cách khác biệt để lưu trữ kèo bóng đá c1. kèo bóng đá c1 có thể được lưu trữ trong một bảng sử dụngPostgreSQL'sKiểu kèo bóng đá c1byteahoặc bằng cách sử dụngĐối tượng lớnTính năng lưu trữ kèo bóng đá c1 trong một bảng riêng ở định dạng đặc biệt và đề cập đến đến bảng đó bằng cách lưu trữ giá trị của loạioidtrong bảng của bạn.
Để xác định phương pháp nào phù hợp bạn cần Hiểu những hạn chế của từng phương pháp. ThebyteaKiểu dữ liệu không phù hợp để lưu trữ rất Một lượng lớn kèo bóng đá c1. Trong khi một cột loạibyteacó thể chứa tối đa 1gig kèo bóng đá c1, nó sẽ yêu cầu một lượng lớn bộ nhớ (RAM) để xử lý một giá trị lớn như vậy. Lớn Phương thức đối tượng để lưu trữ kèo bóng đá c1 phù hợp hơn để lưu trữ Giá trị rất lớn, nhưng nó có những hạn chế riêng. Cụ thể Việc xóa một hàng chứa một đối tượng lớn không xóa Đối tượng lớn. Xóa đối tượng lớn là một hoạt động riêng biệt cần phải được thực hiện. Các đối tượng lớn cũng có một số bảo mật các vấn đề vì bất kỳ ai kết nối với chế độ xem trường hợp cơ sở dữ liệu và/hoặc sửa đổi bất kỳ đối tượng lớn nào, ngay cả khi chúng không có quyền Xem/Cập nhật hàng chứa đối tượng lớn.
7.2 là bản phát hành đầu tiên củaJDBCTrình điều khiển hỗ trợbyteaKiểu dữ kèo bóng đá c1. Sự ra đời của điều này
Chức năng trong 7.2 đã đưa ra một sự thay đổi trong hành vi
so với các bản phát hành trước đó. Trong 7.2 Các phương thứcgetBytes ()
, setBytes ()
, getBinaryStream ()
vàsetBinaryStream ()
hoạt động trênbyteaKiểu dữ kèo bóng đá c1. Trong 7.1 Các phương thức này hoạt động trênoidKiểu dữ kèo bóng đá c1 được liên kết với lớn
Đối tượng. Có thể hoàn nguyên trình điều khiển trở lại 7.1 cũ
hành vi bằng cách đặttương thích
thuộc tính trênKết nối
đến a
Giá trị của7.1
Để sử dụngbyteaKiểu dữ kèo bóng đá c1 bạn nên
chỉ cần sử dụnggetBytes ()
,
setBytes ()
, getBinaryStream ()
hoặcsetBinaryStream ()
Phương pháp.
Để sử dụng chức năng đối tượng lớn, bạn có thể sử dụngLargeObject
APIĐược cung cấp bởiPostgreSQL JDBCTrình điều khiển hoặc bằng cách sử dụnggetBlob ()
vàsetBlob ()
Phương pháp.
quan trọng:choPostgreSQL, bạn phải truy cập lớn Các đối tượng trong mộtSQLGiao dịch. Bạn sẽ mở một giao dịch bằng cách sử dụng
setAutoCommit ()
Phương pháp với một tham số đầu vào củaSai.
kèo bóng đá c1 ý:Trong một bản phát hành trong tương lai củaJDBCtrình điều khiển,
getBlob ()
vàsetBlob ()
Phương pháp có thể không còn tương tác với các đối tượng lớn và thay vào đó sẽ hoạt động trênbyteaKiểu dữ kèo bóng đá c1. Vì vậy, nó được khuyến nghị rằng bạn sử dụngLargeObject
APINếu bạn có ý định sử dụng Các đối tượng lớn.
Ví dụ 8-4. Ví dụ kèo bóng đá c1
Ví dụ: giả sử bạn có một bảng chứa tệp Tên của một hình ảnh và bạn cũng muốn kèo bóng đá c1 trữ hình ảnh trong mộtbyteaCột:
Tạo hình ảnh bảng (văn bản imgname, img bytea);
Để chèn một hình ảnh, bạn sẽ sử dụng:
Tệp tệp = Tệp mới ("myImage.gif"); FileInputStream fis = new FileInputStream (tệp); Đã chuẩn bị ps = Conn.Preparestatement ("chèn vào các giá trị hình ảnh (?,?)"); ps.setString (1, file.getName ()); ps.SetBinaryStream (2, fis, file.length ()); ps.executeUpdate (); ps.close (); fis.close ();
ở đây,setBinaryStream ()
Chuyển một số byte đã đặt từ một luồng vào cột
loạibytea. Điều này cũng có thể đã được
hoàn thành bằng cách sử dụngsetBytes ()
Phương pháp
Nếu nội dung của hình ảnh đã ở trongbyte []
.
Truy xuất một hình ảnh thậm chí còn dễ dàng hơn. (Chúng tôi sử dụngChuẩn bị
ở đây, nhưngcâu lệnh
lớp có thể được sử dụng như nhau.)
PreadStatement PS = con.Preparestatement ("Chọn IMG từ hình ảnh trong đó imgname =?"); ps.setString (1, "myimage.gif"); Resultset rs = ps.executeQuery (); if (rs! = null) while (rs.next ()) byte [] imgBytes = rs.getBytes (1); // Sử dụng luồng theo một cách nào đó ở đây Rs.close ();
Ở đây kèo bóng đá c1 được lấy dưới dạngbyte []
. Bạn có thể đã sử dụng mộtInputStream
Đối tượng thay thế.
Ngoài ra, bạn có thể kèo bóng đá c1 trữ một tệp rất lớn và
muốn sử dụngLargeObject
APIĐể kèo bóng đá c1 trữ tệp:
Tạo bảng Imageslo (văn bản imgname, imgoid oid);
Để chèn một hình ảnh, bạn sẽ sử dụng:
// Tất cả các cuộc gọi API lớn phải nằm trong giao dịch Conn.SetAutoCommit (sai); // Yêu cầu Trình quản lý đối tượng lớn thực hiện các hoạt động với LargeObjectManager lobj = ((org.postgresql.connection) Conn) .getLarGeObjectApi (); // Tạo một đối tượng lớn mới int oid = lobj.create (lớn // Mở đối tượng lớn để ghi LargeObject obj = lobj.open (OID, LargeObjectManager.Write); // Bây giờ hãy mở tệp Tệp tệp = Tệp mới ("MyImage.gif"); FileInputStream fis = new FileInputStream (tệp); // sao chép dữ kèo bóng đá c1 từ tệp vào đối tượng lớn byte buf [] = byte mới [2048]; int s, tl = 0; while ((s = fis.read (buf, 0, 2048)) 0) obj.Write (BUF, 0, S); tl += s; // Đóng đối tượng lớn obj.close (); // Bây giờ chèn hàng vào ImageSLO Đã chuẩn bị ps = Conn.Preparestatement ("chèn vào các giá trị hình ảnh (?,?)"); ps.setString (1, file.getName ()); ps.setInt (2, oid); ps.executeUpdate (); ps.close (); fis.close ();
Truy xuất hình ảnh từ đối tượng lớn:
// Tất cả các cuộc gọi API lớn phải nằm trong giao dịch Conn.SetAutoCommit (sai); // Yêu cầu Trình quản lý đối tượng lớn thực hiện các hoạt động với LargeObjectManager lobj = ((org.postgresql.connection) Conn) .getLarGeObjectApi (); Đã chuẩn bị ps = con.preparestatement ("chọn imgoid từ ImageSLO trong đó imgname =?"); ps.setString (1, "myimage.gif"); Resultset rs = ps.executeQuery (); if (rs! = null) while (rs.next ()) // Mở vật thể lớn để đọc int oid = rs.getInt (1); LargeObject obj = lobj.open (OID, LargeObjectManager.read); // Đọc dữ kèo bóng đá c1 byte buf [] = byte mới [obj.size ()]; obj.Read (buf, 0, obj.size ()); // Làm điều gì đó với dữ kèo bóng đá c1 đọc ở đây // Đóng đối tượng obj.close (); Rs.close ();