0

我正在使用 Teradata jdbc 驱动程序 13.00.00.10,并尝试将具有 1 亿行的平面文件上传到 teradata。

我从一张干净的桌子开始。

首先,我尝试遍历整个文件,对每一行执行 addBatch(),最后只执行一个 executeBatch():

        while ((s = reader.readLine())!=null ){
            String[] columns = StringUtils.split(s, separator);
            for (int j=0; j <columns.length; j++){
                st.setString(j+1,columns[j]);
            }
            st.addBatch();
            i++;
            if (i % 10000 ==0 ){
                ULogger.info(this, "imported " + i + " lines.");
            }

        }
        st.executeBatch();

这很快消耗了我的应用程序的所有内存。

我设置了 9GB XMX,并在大约 4000 万个 addBatch() 之后得到了 OutOfMemory。

然后我尝试定期执行 executeBatch() - 遍历文件,每 2000 万个 addBatch() 执行一次 executeBatch()。

       while ((s = reader.readLine())!=null ){
            String[] columns = StringUtils.split(s, separator);
            for (int j=0; j <columns.length; j++){
                st.setString(j+1,columns[j]);
            }
            st.addBatch();
            i++;
            if (i % 20000000 ==0 ){
                   st.executeBatch();

                   st.clearWarnings();
            }

        }
        st.executeBatch();

在这种情况下,第一个 executeBatch() 成功了。

但是,第二个 executeBatch() 失败,出现“开始快速加载数据库表 XXX 时出错”。

谁能解释我应该如何加载 1 亿行?

是否有我缺少的配置(例如,告诉驱动程序定期推送一些更新而不是将它们保存在内存中)?

谢谢,

一个。

4

1 回答 1

2

在 Teradata 用户论坛上得到了答案,该论坛将我引导至常见问题解答 - (http://developer.teradata.com/connectivity/faq),其中说正确的工作方式是定期调用 executeBatch();但是,为了做到这一点,您需要先关闭连接上的自动提交,并确保最后提交。

所以我的代码现在看起来像这样:

        **con.setAutoCommit(false);**
        while ((s = reader.readLine())!=null ){
            String[] columns = StringUtils.split(s, separator);
            for (int j=0; j <columns.length; j++){
                st.setString(j+1,columns[j]);
            }
            st.addBatch();
            i++;
            if (i % 20000000 ==0 ){
                   st.executeBatch();

                   st.clearWarnings();
            }

        }
        st.executeBatch();
        **con.commit();**

奇迹般有效。

FAQ 中唯一没有 100% 清楚的是块大小。它说一些令人困惑的内容,例如“与您的 JVM 堆可以承受的一样大”以及“将来我们会建议将其设置为 50K-100K。这两者似乎相互矛盾,我已将其设置为 1000 万,它是工作发现。

此外 - Teradata JDBC 中显然有一个 CSV 快速加载器功能 - 请参阅http://developer.teradata.com/doc/connectivity/jdbc/reference/current/jdbcug_chapter_2.html#BABFGFA2 - 通常可以提供更好的性能。

于 2011-10-07T21:06:34.897 回答