Java 将数百万行从teradata传输到mySQL
我必须将大约500万行数据从Teradata传输到MySQL。任何人都可以建议我最快的方式通过网络来做这件事,而不使用文件系统。我不熟悉Teradata和MySQL。我想每周以批处理作业的形式运行此传输,因此我正在寻找可以完全自动化的解决方案。如有任何建议或提示,将不胜感激 我已经编写了使用JDBC从Teradata获取记录并将其插入MySQL的代码。但是它非常慢,所以我希望使代码更高效。我之所以使用泛型,是因为我没有受实现约束的解决方案,因为除了提高现有代码的效率外,我还愿意接受其他替代方案。但是我不想使用文件系统,因为维护或更新脚本并不容易 我的实施: 从teradata获取记录:Java 将数百万行从teradata传输到mySQL,java,mysql,sql,bigdata,teradata,Java,Mysql,Sql,Bigdata,Teradata,我必须将大约500万行数据从Teradata传输到MySQL。任何人都可以建议我最快的方式通过网络来做这件事,而不使用文件系统。我不熟悉Teradata和MySQL。我想每周以批处理作业的形式运行此传输,因此我正在寻找可以完全自动化的解决方案。如有任何建议或提示,将不胜感激 我已经编写了使用JDBC从Teradata获取记录并将其插入MySQL的代码。但是它非常慢,所以我希望使代码更高效。我之所以使用泛型,是因为我没有受实现约束的解决方案,因为除了提高现有代码的效率外,我还愿意接受其他替代方案。
connection = DBConnectionFactory.getDBConnection(SOURCE_DB);
statement = connection.createStatement();
rs = statement.executeQuery(QUERY_SELECT);
while (rs.next()) {
Offer offer = new Offer();
offer.setExternalSourceId(rs.getString("EXT_SOURCE_ID"));
offer.setClientOfferId(rs.getString("CLIENT_OFFER_ID"));
offer.setUpcId(rs.getString("UPC_ID"));
offers.add(offer);
}
int count = 0;
if (isUpdated) {
for (Offer offer : offers) {
count++;
stringBuilderUpdate = new StringBuilder();
stringBuilderUpdate = stringBuilderUpdate
.append(QUERY_INSERT);
stringBuilderUpdate = stringBuilderUpdate.append("'"
+ offer.getExternalSourceId() + "'");
statement.addBatch(stringBuilderUpdate.toString());
queryBuilder = queryBuilder.append(stringBuilderUpdate
.toString() + SEMI_COLON);
if (count > LIMIT) {
countUpdate = statement.executeBatch();
LOG.info("DB update count : " + countUpdate.length);
count = 0;
}
}
if (count > 0) {
// Execute batch
countUpdate = statement.executeBatch();
}
在mySQL中插入记录:
connection = DBConnectionFactory.getDBConnection(SOURCE_DB);
statement = connection.createStatement();
rs = statement.executeQuery(QUERY_SELECT);
while (rs.next()) {
Offer offer = new Offer();
offer.setExternalSourceId(rs.getString("EXT_SOURCE_ID"));
offer.setClientOfferId(rs.getString("CLIENT_OFFER_ID"));
offer.setUpcId(rs.getString("UPC_ID"));
offers.add(offer);
}
int count = 0;
if (isUpdated) {
for (Offer offer : offers) {
count++;
stringBuilderUpdate = new StringBuilder();
stringBuilderUpdate = stringBuilderUpdate
.append(QUERY_INSERT);
stringBuilderUpdate = stringBuilderUpdate.append("'"
+ offer.getExternalSourceId() + "'");
statement.addBatch(stringBuilderUpdate.toString());
queryBuilder = queryBuilder.append(stringBuilderUpdate
.toString() + SEMI_COLON);
if (count > LIMIT) {
countUpdate = statement.executeBatch();
LOG.info("DB update count : " + countUpdate.length);
count = 0;
}
}
if (count > 0) {
// Execute batch
countUpdate = statement.executeBatch();
}
有谁能告诉我,我们是否能使这个代码更有效
谢谢
PS:请忽略上面代码中的语法错误,因为这段代码工作正常。由于复制和粘贴,可能会丢失一些信息。将数据导入MySQL的方法是使用or,这是加载数据填充的命令行界面,它涉及从文件加载数据,最好位于本地文件系统上
从文本文件加载表格时,请使用“加载数据填充”。这是
通常比使用INSERT语句快20倍
因此,尽管您不想使用文件系统,但我建议考虑向文件创建转储,将其转储到MySQL服务器上,并使用上面提到的方法加载数据。
所有这些任务都可以通过脚本实现完全自动化。此外,在向表中添加大量数据时,删除所有索引的速度更快。执行大容量插入,然后重新创建索引。如果插入的数据占总数据的50%以上,这种情况可能更为真实。您最终是如何完成此任务的?