나는이 질문에 대한 답을 알고 있다고 생각하지만, 전문가들과 함께이 질문을 확인하고 싶다. "그렇습니다. 배치 크기 제한이 너무 작기 때문에 16입니다. 따라서 실제적으로 일괄 처리는 테라 데이타 CLOB에서는 쓸모가 없습니다."Teradata CLOB 일괄 처리가 JDBC에서 쓸모 없습니까?
여기 내 이유가 있습니다. 다음은 작업중인 Java 코드입니다. 나는
public class TestClob {
public void test() throws ClassNotFoundException, SQLException, IOException {
Connection conn1, conn2;
conn1 = DriverManager.getConnection(..., user, pass);
conn2 = DriverManager.getConnection(..., user, pass);
Statement select = conn1.createStatement();
ResultSet rs = select.executeQuery("SELECT TOP 100 myClob FROM myTab ");
int totalRowNumber = 0;
PreparedStatement ps = null;
Clob clob = null;
Reader clobReader = null;
while (rs.next()) {
totalRowNumber++;
System.out.println(totalRowNumber);
clob = rs.getClob(1);
clobReader = clob.getCharacterStream();
ps = conn2.prepareStatement("INSERT INTO myTab2 (myClob2) values (?) ");
ps.setCharacterStream(1, clobReader , clob.length());
ps.execute(); // HERE I just execute the current row
clob.free(); // FREE the CLOB and READER objects
clobReader.close();
}
conn2.commit();
ps.close();
select.close();
rs.close();
은 테라 데이타의 규칙에 따라, 나는 동시에 열
LOB
에 관련된 16 개 이상의 개체를 가질 수 없습니다 스트리밍을 사용하여 다른 하나 개의 데이터베이스 연결에서 테이블을 복사합니다.
따라서 Clob clob
과 Reader clobReader
이 각각 해제되고 닫혀 있는지 확인해야합니다.
그래서 나는 두 가지 옵션
1
)을executeBatch()
방법을 한 번에 16
Clob clob
및
Reader clobReader
개의 물체를 가지고 있습니다.
2) execute()
메서드를 수행하고 바로 뒤에 Clob clob
및 Reader clobReader
개체를 닫습니다.
결론 : Teradata CLOB 배치 삽입은 JDBC에서는 쓸모가 없습니다. 하나는
이 제발 도와주세요의 Clob를 삽입하려고 할 때 16 개 이상의의 배치 크기를 설정하고 나는이 제대로
내가 어떤 다른 방법이 표시되지 않는 이해하는 경우 알려 수 없습니다
귀하의 사용 사례에서 제한 사항이 실제로 실망 스럽다는 것을 알고 있습니다. 그러나 이것이 CLOB 일괄 처리의 한계입니까? 파일에서 CLOB를 삽입하는 경우이 제한이 있습니까? – Insac
파일에서 읽을'Reader' 개체가 있어야합니다. 그리고 Teradata LOB 규칙은 모든 객체가'executeUpdate'에 열려 있어야한다고 말하기 때문에 닫을 수 없습니다 https://developer.teradata.com/blog/tomnolan/2016/03/lob-locator-lifetime – john
읽는 방법을 모르겠습니다. 파일에서 그것을 해결할 수 있습니다. 다른 데이터베이스 연결에서 직접 읽습니다. Teradata LOB 문제입니다. INSERT Teradata를 작성하려면 모든 LOB 오브젝트가 열려 있어야합니다. 반면 테라 데이타는 16 개가 넘지 않아야한다고 말합니다. – john