私はこの質問に対する答えを知っていると思うが、ここでも専門家と確認したい。私は答えが「はい、バッチサイズの制限が16であり、これは少なすぎます。だから、事実上、バッチ処理はTeradata CLOBでは役に立たない」と述べています。TeradataのCLOBバッチ処理はJDBCでは役に立たないのですか?
ここに私の推論があります。ここに、動作中のJavaコードがあります。私は、Teradataのルールに基づいて
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();
をストリーミング使用して別の1つのデータベース接続からテーブルをコピーし、私は同時にオープンLOB
に関連する16以上のオブジェクトを持つことができません。
したがって、Clob clob
とReader clobReader
がそれぞれ解放され、閉じられていることを確認する必要があります。
だから私は二つの選択肢
1を持っているが)executeBatch()
法を行い、一度に最大16個のClob clob
とReader clobReader
オブジェクトを持っています。
2)メソッドを実行し、その直後に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オブジェクトをオープンする必要があります。一方、Teradataは、16個以上のものは存在しないことを要求しています。 – john