【发布时间】:2021-07-26 08:01:51
【问题描述】:
我有问题。现在我正在使用 JOOQ 使用以下代码在我的数据库中插入大约 100.000 条记录:
try (Connection conn = DriverManager.getConnection(SqlConn.getURL(), SqlConn.getUSERNAME(), SqlConn.getPASSWORD())) {
DSLContext create = DSL.using(conn, SQLDialect.MYSQL);
for (String key : trendlines.keySet()) {
for (Trendline trendline : trendlines.get(key)) {
String sql = createTrendlineQuery(trendline);
create.fetch(sql);
}
}
}
catch (Exception e) {
e.printStackTrace();
}
使用函数createTrendlineQuery():
private String createTrendlineQuery(Trendline trendline) {
return "INSERT INTO Trendline (openTime, market, coin, period, metric, number, slope, interceptY, percentage, formula, data) VALUES (" +
trendline.getOpenTime() + ", '" +
trendline.getMarket() + "', '" +
trendline.getCoin() + "', '" +
trendline.getPeriod() + "', '" +
trendline.getFormula() + "') " +
"ON DUPLICATE KEY UPDATE " +
"openTime = " + trendline.getOpenTime() + ", " +
"market = '" + trendline.getMarket()+ "', " +
"coin = '" + trendline.getCoin() + "', " +
"period = '" + trendline.getPeriod() + "', " +
"formula = '" + trendline.getFormula() + "';";
}
但这给我的互联网/数据库带来了很大的负载,所以我发现你可以为大数据进行批量插入。我在 JOOQ 中找到了关于批量插入的以下页面:https://www.jooq.org/doc/3.14/manual/sql-execution/batch-execution/。现在我认为这是我需要的,但我有一个问题。这个例子在我的例子中看起来像这样:
try (Connection conn = DriverManager.getConnection(SqlConn.getURL(), SqlConn.getUSERNAME(), SqlConn.getPASSWORD())) {
DSLContext create = DSL.using(conn, SQLDialect.MYSQL);
create.batch(create.insertInto(DSL.table("Trendline"), DSL.field("openTime"), DSL.field("market"), DSL.field("coin") ).values((Integer) null, null, null))
.bind( trendline.getOpenTime() , trendline.getMarket() , trendline.getCoin() )
.bind( trendline.getOpenTime() , trendline.getMarket() , trendline.getCoin() )
.bind( trendline.getOpenTime() , trendline.getMarket() , trendline.getCoin() )
.bind( trendline.getOpenTime() , trendline.getMarket() , trendline.getCoin() )
.execute();
}
catch (Exception e) {
e.printStackTrace();
}
除了我需要将 2 for-loops 放在 create.batch() 之间以编程方式创建插入。如何插入for loops,我是否使用了正确的批量插入方式来减少互联网流量和数据库压力?
【问题讨论】:
-
是的,起初我只是使用普通工作,但后来有人告诉我使用 JOOQ 之类的包装器,因为我正在做说唱歌手已经为我做的事情
-
是的,因为现在我在代码中到处都在使用 JOOQ,所以我需要保持一致