Phiên bản không được hỗ trợ:7.4 / 7.3 / 7.2
Tài tỷ lệ kèo bóng đá tối nay này dành cho phiên bản không được hỗ trợ của PostgreSQL.
Bạn có thể muốn xem cùng một trang chohiện tạiPhiên bản hoặc một trong các phiên bản được hỗ trợ khác được liệt kê ở trên thay thế.

31.7. Lưu trữ tỷ lệ kèo bóng đá tối nay

PostgreSQLcung cấp hai Những cách khác biệt để lưu trữ tỷ lệ kèo bóng đá tối nay. tỷ lệ kèo bóng đá tối nay có thể được lưu trữ trong một bảng sử dụng kiểu dữ liệubyteahoặc bởi sử dụng tính năng đối tượng lớn lưu trữ tỷ lệ kèo bóng đá tối nay trong một bảng riêng ở định dạng đặc biệt và đề cập đến bảng đó bằng cách Lưu trữ giá trị của loạioidTrong của bạn 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 tỷ lệ kèo bóng đá tối nay. Trong khi một cột loạibyteacó thể chứa tới 1 GB tỷ lệ kèo bóng đá tối nay, nó sẽ Yêu cầu một lượng lớn bộ nhớ để xử lý một giá trị lớn như vậy. Phương pháp đối tượng lớn để lưu trữ tỷ lệ kèo bóng đá tối nay phù hợp hơn Để lưu trữ các giá trị rất lớn, nhưng nó có những hạn chế riêng. Cụ thể xóa một hàng có chứa một đối tượng lớn Tham chiếu không xóa đối tượng lớn. Xóa lớn Đối tượng là một hoạt động riêng biệt cần được thực hiện. Lớn Các đối tượng cũng có một số vấn đề bảo mật vì bất kỳ ai kết nối với cơ sở dữ liệu có thể xem và/hoặc sửa đổi bất kỳ đối tượng lớn nào, ngay cả khi Họ không có quyền xem/cập nhật hàng có chứa Tham chiếu đối tượng lớn.

Phiên bả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ữ tỷ lệ kèo bóng đá tối nay. 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 đó. Kể từ 7.2, các phương thứcgetBytes (), setBytes (), getBinaryStream ()setBinaryStream ()hoạt động trênbyteaKiểu dữ tỷ lệ kèo bóng đá tối nay. Trong 7.1 và sớm hơn, các phương pháp này hoạt động trênoidKiểu dữ tỷ lệ kèo bóng đá tối nay được liên kết với các đối tượng lớn. Có thể hoàn nguyên trình điều khiển trở lại hành vi cũ 7.1 bằng cách đặt thuộc tínhtương thíchtrênkết nốiĐối tượng cho giá trị7.1.

Để sử dụngbyteaKiểu dữ tỷ lệ kèo bóng đá tối nay 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ụngLargeObjectlớp được cung cấp bởiPostgreSQL JDBCtrình điều khiển hoặc bằng cách sử dụnggetBlob ()setBlob ()Phương pháp.

quan trọng:Bạn phải truy cập các đối tượng lớn trong mộtSQLKhối giao dịch. Bạn có thể bắt đầu một khối giao dịch bằng cách gọisetautocommit (false).

tỷ lệ kèo bóng đá tối nay ý:Trong một bản phát hành trong tương lai củaJDBCtrình điều khiển,getBlob ()setBlob ()Phương pháp 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ên kiểu dữ tỷ lệ kèo bóng đá tối naybytea. Vì vậy, nó được khuyến nghị rằng bạn sử dụnglớn APINếu bạn có ý định sử dụng Các đối tượng lớn.

Ví dụ 31-8Chứa một số ví dụ về cách xử lý tỷ lệ kèo bóng đá tối nay bằng cách sử dụng PostgreSQLJDBCtrình điều khiển.

Ví dụ 31-8. Xử lý tỷ lệ kèo bóng đá tối nay trongJDBC

Ví dụ: giả sử bạn có một bảng chứa tệp Tên của hình ảnh và bạn cũng muốn tỷ lệ kèo bóng đá tối nay 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 số lượng 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ệnhlớp có thể được sử dụng như nhau.)

11603_11922

Ở đây tỷ lệ kèo bóng đá tối nay đượ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ể tỷ lệ kèo bóng đá tối nay trữ một tệp rất lớn và muốn sử dụngLargeObject APIĐể tỷ lệ kèo bóng đá tối nay 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 khối 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.pgconnection) Conn).

// Tạo một đối tượng lớn mới
int oid = lobj.create (lớn

// Mở vật thể lớn để viết
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ữ tỷ lệ kèo bóng đá tối nay 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 khối 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.pgconnection) Conn).

Đã 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ữ tỷ lệ kèo bóng đá tối nay
        byte buf [] = byte mới [obj.size ()];
        obj.Read (buf, 0, obj.size ());
        // Làm điều gì đó với dữ tỷ lệ kèo bóng đá tối nay đọc ở đây

        // Đóng đối tượng
        obj.close ();

    Rs.close ();