이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.현재버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

8.6. 바이너리 토토 핫 저장

포스트그레SQL2개 제공 바이너리 데이터를 저장하는 독특한 방법. 바이너리 데이터를 저장할 수 있습니다. 다음을 사용하는 테이블PostgreSQL의바이너리 토토 핫 유형바이테아또는 다음을 사용하여대형 개체다음을 저장하는 기능 이진 데이터를 별도의 테이블에 특별한 형식으로 저장하고 참조합니다. 유형의 값을 저장하여 해당 테이블에OID당신의 테이블에.

어떤 방법이 적절한지 결정하려면 다음을 수행해야 합니다. 각 방법의 한계를 이해합니다. 그만큼바이테아토토 핫 유형은 저장에 적합하지 않습니다. 대량의 바이너리 토토 핫. 유형의 열인 동안바이테아최대 1Gig의 바이너리 토토 핫를 저장할 수 있습니다. 엄청난 양의 메모리가 필요합니다()는 이렇게 큰 값을 처리합니다. 더 라지 이진 데이터를 저장하는 객체 방법은 저장에 더 적합합니다. 매우 큰 값이지만 자체적인 한계가 있습니다. 구체적으로 대형 개체가 포함된 행을 삭제해도 해당 행은 삭제되지 않습니다. 대형 개체. 대형 개체 삭제는 별도의 작업입니다. 그것은 수행되어야합니다. 대형 객체에도 약간의 보안이 있습니다. 데이터베이스 사례 보기 및/또는에 연결된 모든 사람 이후의 문제 권한이 없더라도 대형 개체를 수정할 수 있습니다. 대형 개체가 포함된 행을 확인/업데이트합니다.

7.2는의 첫 번째 릴리스입니다.JDBC다음을 지원하는 드라이버바이테아데이터 유형. 이것의 소개 7.2의 기능은 다음과 같이 동작을 변경했습니다. 이전 릴리스와 비교. 7.2에서는 메소드getBytes(), setBytes(), getBinaryStream()그리고setBinaryStream()작동바이테아데이터 유형. 7.1에서는 이러한 메서드가 다음에서 작동했습니다.OID대형과 연관된 데이터 유형 사물. 드라이버를 이전 7.1로 되돌릴 수 있습니다. 를 설정하여 동작호환 가능속성연결에 값7.1

다음을 사용하려면바이테아필요한 데이터 유형 간단히 다음을 사용하세요.getBytes(), setBytes(), getBinaryStream()또는setBinaryStream()방법.

대형 개체 기능을 사용하려면 다음 중 하나를 사용할 수 있습니다.대형객체 API제공:포스트그레SQL JDBC드라이버 또는 다음을 사용하여getBLOB()그리고setBLOB()방법.

중요:포스트그레SQL, 대형에 액세스해야 합니다. 내의 객체SQL거래. 다음을 사용하여 트랜잭션을 엽니다.setAutoCommit()메소드 의 입력 매개변수거짓.

참고:향후 릴리스에서는JDBC운전사님,getBLOB()그리고setBLOB()메소드가 더 이상 상호작용하지 않을 수 있습니다. Large Objects를 사용하고 대신 작업할 예정입니다.바이테아데이터 유형. 따라서 다음을 수행하는 것이 좋습니다. 사용하다대형객체 API사용하려는 경우 대형 개체.

예 8-4. 바이너리 토토 핫 예

예를 들어, 파일이 포함된 테이블이 있다고 가정해 보겠습니다. 이미지의 이름을 지정했으며 해당 이미지를 a에 저장하려고 합니다.바이테아열:

CREATE TABLE 이미지(imgname 텍스트, img bytea);

이미지를 삽입하려면 다음을 사용하세요.

파일 파일 = 새 파일("myimage.gif");
FileInputStream fis = new FileInputStream(파일);
ReadyStatement ps = conn.prepareStatement("이미지 값에 삽입 (?, ?)");
ps.setString(1, file.getName());
ps.setBinaryStream(2, fis, file.length());
ps.executeUpdate();
ps.close();
fis.close();

여기,setBinaryStream()스트림에서 설정된 수의 바이트를 열로 전송합니다. 유형바이테아. 이것도 그럴 수도 있었지 다음을 사용하여 완료했습니다.setBytes()방법 이미지의 내용이 이미 a에 있는 경우바이트[].

이미지 검색이 더욱 쉬워졌습니다. (우리는 사용합니다PreparedStatement여기 있지만성명클래스도 동일하게 사용할 수 있습니다.)

PreparedStatement ps = con.prepareStatement("WHERE imgname=?"에서 이미지에서 img를 선택하세요.");
ps.setString(1, "myimage.gif");
ResultSet rs = ps.executeQuery();
if (rs != null) 
    동안(rs.next()) 
        byte[] imgBytes = rs.getBytes(1);
        // 여기서 어떤 방식으로든 스트림을 사용합니다.

    rs.close();

여기서 바이너리 데이터는 다음과 같이 검색되었습니다.바이트[]. 당신은 a를 사용할 수 있었습니다입력스트림대신 개체입니다.

또는 매우 큰 파일을 저장하고 다음을 사용하고 싶습니다.대형객체 API파일을 저장하려면:

CREATE TABLE 이미지LO(imgname 텍스트, imgOID OID);

이미지를 삽입하려면 다음을 사용하십시오:

// 모든 LargeObject API 호출은 트랜잭션 내에 있어야 합니다.
conn.setAutoCommit(false);

// 작업을 수행하기 위해 Large Object Manager를 가져옵니다.
LargeObjectManager lobj = ((org.postgresql.Connection)conn).getLargeObjectAPI();

//새 대형 객체 생성
int oid = lobj.create(LargeObjectManager.READ | LargeObjectManager.WRITE);

//쓰기 위해 대형 객체 열기
LargeObject obj = lobj.open(oid, LargeObjectManager.WRITE);

// 이제 파일을 엽니다.
파일 file = new File("myimage.gif");
FileInputStream fis = new FileInputStream(파일);

// 파일의 데이터를 대형 객체에 복사합니다.
바이트 buf[] = 새 바이트[2048];
int s, tl = 0;
while ((s = fis.read(buf, 0, 2048))  0)

        obj.write(buf, 0, s);
        tl += s;

// 대형 객체를 닫습니다.
obj.close();

//이제 이미지LO에 행을 삽입합니다.
ReadyStatement ps = conn.prepareStatement("이미지에 삽입LO VALUES (?, ?)");
ps.setString(1, file.getName());
ps.setInt(2, oid);
ps.executeUpdate();
ps.close();
fis.close();

대형 개체에서 이미지 검색 중:

// 모든 LargeObject API 호출은 트랜잭션 내에 있어야 합니다.
conn.setAutoCommit(false);

// 작업을 수행하기 위해 Large Object Manager를 가져옵니다.
LargeObjectManager lobj = ((org.postgresql.Connection)conn).getLargeObjectAPI();

ReadyStatement ps = con.prepareStatement("이미지 LO에서 imgOID를 선택하세요 WHERE imgname=?");
ps.setString(1, "myimage.gif");
ResultSet rs = ps.executeQuery();
if (rs != null) 
    동안(rs.next()) 
        //읽기 위해 대형 객체 열기
        int oid = rs.getInt(1);
        LargeObject obj = lobj.open(oid, LargeObjectManager.READ);

        //데이터 읽기
        byte buf[] = 새로운 byte[obj.size()];
        obj.read(buf, 0, obj.size());
        //여기서 읽은 데이터로 작업 수행

        // 객체를 닫습니다.
        obj.close();

    rs.close();