postgresql두 가지를 제공합니다 이진 토토 핫를 저장하는 독특한 방법. 이진 토토 핫는 저장 될 수 있습니다 사용 테이블postgresql 's이진 토토 핫 유형BYTEA또는 사용하여큰 개체이진 토토 핫는 특별한 형식의 별도 테이블로 유형 값을 저장하여 해당 테이블에OID테이블에서.
필요한 방법을 결정하려면 각 방법의 한계를 이해하십시오. 그만큼BYTEA토토 핫 유형은 저장에 적합하지 않습니다 다량의 이진 토토 핫. 유형의 열BYTEA이진 토토 핫의 최대 1Gig를 보유 할 수 있습니다 엄청난 양의 메모리가 필요합니다 (RAM) 그러한 큰 값을 처리하려면. 큰 이진 데이터 저장을위한 객체 방법은 저장에 더 적합합니다. 매우 큰 값이지만 자체 제한이 있습니다. 구체적으로 큰 객체가 포함 된 행을 삭제하는 것은 큰 대상. 큰 객체를 삭제하는 것은 별도의 작업입니다 수행해야합니다. 큰 물체에는 약간의 보안이 있습니다 데이터베이스 케이스보기 및/또는 권한이 없어도 큰 물체를 수정하십시오. 큰 개체가 포함 된 행을보고/업데이트합니다.
7.2는의 첫 번째 릴리스입니다.JDBC지원하는 드라이버BYTEA데이터 유형. 이것의 소개
7.2의 기능은 행동의 변화를 다음과 같이 도입했습니다.
이전 릴리스와 비교했습니다. 7.2에서 방법getBytes ()
, setBytes ()
, getBinaryStream ()
및setBinaryStream ()
BYTEA토토 핫 유형. 7.1 에서이 방법은에서 작동했습니다.OID대형과 관련된 데이터 유형
사물. 운전자를 이전 7.1로 되돌릴 수 있습니다.
를 설정하여 행동호환
속성Connection
a
의 가치7.1
사용하려면BYTEA토토 핫 유형
간단히 사용하십시오getBytes ()
,
setBytes ()
, getBinaryStream ()
또는setBinaryStream ()
방법.
큰 객체 기능을 사용하려면를 사용할 수 있습니다.BARGEOBJECT
API제공postgresql JDBC드라이버 또는 사용하여getBlob ()
andsetBlob ()
방법.
중요 :forPostgreSQL, 큰 액세스해야합니다 내 객체SQL거래. 당신은를 사용하여 거래를 열 것입니다.
setAutocommit ()
의 입력 매개 변수거짓.
참고 :향후 릴리스에서JDBC드라이버,
getBlob ()
andsetBlob ()
메소드가 더 이상 상호 작용하지 않을 수 있습니다 큰 물체로 대신 작동합니다BYTEA토토 핫 유형. 그래서 당신을 추천합니다 사용BARGEOBJECT
API사용하려는 경우 큰 물건.
예 8-4. 이진 토토 핫 예제
예를 들어 파일이 포함 된 테이블이 있다고 가정합니다. 이미지의 이름과 이미지를 A에 저장하고 싶습니다BYTEA열 :
테이블 이미지 생성 (Imgname Text, IMG Bytea);
이미지를 삽입하려면 다음을 사용합니다.
파일 = 새 파일 ( "myimage.gif"); fileInputStream fis = 새로운 fileInputStream (file); preparedstatement ps = conn.preparestatement ( "이미지 값 (?,?)에 삽입"); ps.SetString (1, file.getName ()); ps.setbinarystream (2, fis, file.length ()); ps.ExecuteUpdate (); ps.close (); fis.close ();
여기,setBinaryStream ()
스트림에서 열에서 열에서 세트 수를 전송합니다.
유형BYTEA. 이것은 또한 그럴 수도 있습니다
사용 완료setBytes ()
메소드
이미지의 내용이 이미 A에있는 경우byte []
.
이미지를 검색하는 것이 훨씬 쉽습니다. (우리는 사용preparedstatement
여기, 그러나진술
클래스를 동일하게 사용할 수 있습니다.)
preparedstatement ps = con.preparestatement ( "imgname =?") 이미지에서 IMG 선택); ps.SetString (1, "myimage.gif"); resultSet rs = ps.ExecuteQuery (); if (rs! = null) while (rs.next ()) 바이트 [] imgbytes = rs.getBytes (1); // 여기에서 스트림을 사용하십시오 rs.close ();
여기서 바이너리 토토 핫가 A로 검색되었습니다byte []
. 당신은를 사용할 수있었습니다입력 스트림
대상.
또는 매우 큰 파일을 저장하고
사용하고 싶어BARGEOBJECT
API파일을 저장하려면 :
테이블 생성 imagesLo (imgname text, imgoid oid);
이미지를 삽입하려면 다음을 사용합니다.
// 모든 큰 대형 API 호출은 거래 내에 있어야합니다. conn.setAutocommit (false); // 대형 객체 관리자가 bargeobjectmanager lobj = ((org.postgresql.connection) conn) .getLargeObjectapi (); // 새로운 큰 객체를 만듭니다 int oid = lobj.create (bargeobjectmanager.read | margeobjectmanager.write); // 쓰기를 위해 큰 객체를 엽니 다 BARGEOBJECT OBJ = LOBJ.OPEN (OID, BARGEOBJECTMANAGER.WRITE); // 이제 파일을 엽니 다 파일 = 새 파일 ( "myimage.gif"); fileInputStream fis = 새로운 fileInputStream (file); // 파일에서 큰 개체로 데이터를 복사합니다. 바이트 buf [] = 새로운 바이트 [2048]; int s, tl = 0; while ((s = fis.read (buf, 0, 2048)) 0) obj.write (buf, 0, s); tl += s; // 큰 개체를 닫습니다 obj.close (); // 이제 행을 ImagesLo에 삽입하십시오 preparedstatement ps = conn.preparestatement ( "imagesLo 값 (?,?)에 삽입"); ps.SetString (1, file.getName ()); ps.setint (2, oid); ps.ExecuteUpdate (); ps.close (); fis.close ();
큰 개체에서 이미지 검색 :
// 모든 대형 OBJECT API 호출은 거래 내에 있어야합니다. conn.setAutocommit (false); // 대형 객체 관리자가 bargeobjectmanager lobj = ((org.postgresql.connection) conn) .getLargeObjectapi (); preparedstatement ps = con.preparestatement ( "imagelo에서 imgoid를 선택하여 imgname =?"); ps.SetString (1, "myimage.gif"); resultSet rs = ps.ExecuteQuery (); if (rs! = null) while (rs.next ()) // 읽기를 위해 큰 물체를 엽니 다 int oid = rs.getint (1); bargeobject obj = lobj.open (OID, BARGEOBJECTMANAGER.READ); // 데이터를 읽습니다 바이트 buf [] = 새로운 바이트 [obj.size ()]; obj.read (buf, 0, obj.size ()); // 여기에서 읽은 데이터로 무언가를 수행하십시오 // 객체를 닫습니다 obj.close (); rs.close ();