Browse Source

优化sql

jwy_category
review512jwy@163.com 1 month ago
parent
commit
ccae5a033b
  1. 234
      src/main/java/com/techsor/datacenter/sender/dao/DashboardStatisticsDao.java

234
src/main/java/com/techsor/datacenter/sender/dao/DashboardStatisticsDao.java

@ -11,6 +11,7 @@ import java.math.BigDecimal;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
@ -85,69 +86,67 @@ public class DashboardStatisticsDao {
}
public void measureBatchInsert(List<MeasureEvent> list) {
if (list.isEmpty()) return;
// 批量 insert
auroraJdbcTemplate.batchUpdate(
StringBuilder insertSql = new StringBuilder(
"INSERT INTO dashboard_record_measure (" +
"device_id, date_year, date_month, date_day, date_hour, date_minute, date_second, upload_value, upload_at, attr_code) " +
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
new BatchPreparedStatementSetter() {
public void setValues(PreparedStatement ps, int i) throws SQLException {
MeasureEvent e = list.get(i);
StatisticsMeasureInfo info = e.getInfo();
ps.setString(1, e.getDeviceId());
ps.setInt(2, info.getYearKey());
ps.setInt(3, info.getMonthKey());
ps.setInt(4, info.getDayKey());
ps.setInt(5, info.getHourKey());
ps.setInt(6, info.getMinuteKey());
ps.setInt(7, info.getSecondKey());
ps.setString(8, e.getUploadValue());
ps.setLong(9, info.getUploadAt());
ps.setString(10, e.getAttrCode());
}
public int getBatchSize() {
return list.size();
}
}
"device_id, date_year, date_month, date_day, date_hour, date_minute, date_second, " +
"upload_value, upload_at, attr_code) VALUES "
);
// 批量 upsert
auroraJdbcTemplate.batchUpdate(
List<Object> insertParams = new ArrayList<>(list.size() * 10);
for (int i = 0; i < list.size(); i++) {
MeasureEvent e = list.get(i);
StatisticsMeasureInfo info = e.getInfo();
insertSql.append("(?,?,?,?,?,?,?,?,?,?)");
if (i < list.size() - 1) insertSql.append(",");
insertParams.add(e.getDeviceId());
insertParams.add(info.getYearKey());
insertParams.add(info.getMonthKey());
insertParams.add(info.getDayKey());
insertParams.add(info.getHourKey());
insertParams.add(info.getMinuteKey());
insertParams.add(info.getSecondKey());
insertParams.add(e.getUploadValue());
insertParams.add(info.getUploadAt());
insertParams.add(e.getAttrCode());
}
auroraJdbcTemplate.update(insertSql.toString(), insertParams.toArray());
// 实时表
StringBuilder upsertSql = new StringBuilder(
"INSERT INTO dashboard_realtime_measure (" +
"device_id, date_year, date_month, date_day, date_hour, date_minute, date_second," +
"upload_value, min_value, max_value, upload_at, attr_code) " +
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) " +
"ON DUPLICATE KEY UPDATE " +
"upload_value = VALUES(upload_value), " +
"min_value = VALUES(min_value)," +
"max_value = VALUES(max_value)," +
"upload_at = VALUES(upload_at)",
new BatchPreparedStatementSetter() {
public void setValues(PreparedStatement ps, int i) throws SQLException {
MeasureEvent e = list.get(i);
StatisticsMeasureInfo info = e.getInfo();
ps.setString(1, e.getDeviceId());
ps.setInt(2, info.getYearKey());
ps.setInt(3, info.getMonthKey());
ps.setInt(4, info.getDayKey());
ps.setInt(5, info.getHourKey());
ps.setInt(6, info.getMinuteKey());
ps.setInt(7, info.getSecondKey());
ps.setString(8, e.getUploadValue());
ps.setString(9, e.getMinValue().toString());
ps.setString(10, e.getMaxValue().toString());
ps.setLong(11, info.getUploadAt());
ps.setString(12, e.getAttrCode());
}
public int getBatchSize() {
return list.size();
}
}
"device_id, date_year, date_month, date_day, date_hour, date_minute, date_second, " +
"upload_value, min_value, max_value, upload_at, attr_code) VALUES "
);
List<Object> upsertParams = new ArrayList<>(list.size() * 12);
for (int i = 0; i < list.size(); i++) {
MeasureEvent e = list.get(i);
StatisticsMeasureInfo info = e.getInfo();
upsertSql.append("(?,?,?,?,?,?,?,?,?,?,?,?)");
if (i < list.size() - 1) upsertSql.append(",");
upsertParams.add(e.getDeviceId());
upsertParams.add(info.getYearKey());
upsertParams.add(info.getMonthKey());
upsertParams.add(info.getDayKey());
upsertParams.add(info.getHourKey());
upsertParams.add(info.getMinuteKey());
upsertParams.add(info.getSecondKey());
upsertParams.add(e.getUploadValue());
upsertParams.add(e.getMinValue() != null ? e.getMinValue().toString() : null);
upsertParams.add(e.getMaxValue() != null ? e.getMaxValue().toString() : null);
upsertParams.add(info.getUploadAt());
upsertParams.add(e.getAttrCode());
}
upsertSql.append(" ON DUPLICATE KEY UPDATE ")
.append("upload_value = VALUES(upload_value), ")
.append("min_value = VALUES(min_value), ")
.append("max_value = VALUES(max_value), ")
.append("upload_at = VALUES(upload_at)");
auroraJdbcTemplate.update(upsertSql.toString(), upsertParams.toArray());
}
public void insertDeviceAccumulateInfo(String uploadValue, String deviceId, Double incrementToday,
@ -195,70 +194,65 @@ public class DashboardStatisticsDao {
public void accumulateBatchInsert(List<AccumulateEvent> list) {
auroraJdbcTemplate.batchUpdate(
"INSERT INTO dashboard_record_accumulate (" +
"device_id, date_year, date_month, date_day, date_hour, date_minute, date_second, " +
"upload_value, increment_today, increment_minute, upload_at, attr_code) " +
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
AccumulateEvent e = list.get(i);
StatisticsAccumulateInfo info = e.getInfo();
ps.setString(1, e.getDeviceId());
ps.setInt(2, info.getYearKey());
ps.setInt(3, info.getMonthKey());
ps.setInt(4, info.getDayKey());
ps.setInt(5, info.getHourKey());
ps.setInt(6, info.getMinuteKey());
ps.setInt(7, info.getSecondKey());
ps.setString(8, e.getUploadValue());
ps.setDouble(9, e.getIncrementToday() != null ? e.getIncrementToday() : 0.0);
ps.setDouble(10, e.getIncrementMinute() != null ? e.getIncrementMinute() : 0.0);
ps.setLong(11, info.getUploadAt());
ps.setString(12, e.getAttrCode());
}
@Override
public int getBatchSize() {
return list.size();
}
}
);
if (list.isEmpty()) return;
auroraJdbcTemplate.batchUpdate(
"INSERT INTO dashboard_realtime_accumulate_day (" +
"device_id, date_year, date_month, date_day, upload_value, increment_today, upload_at, attr_code) " +
"VALUES (?, ?, ?, ?, ?, ?, ?, ?) " +
"ON DUPLICATE KEY UPDATE " +
"upload_value = VALUES(upload_value), " +
"increment_today = VALUES(increment_today), " +
"upload_at = VALUES(upload_at)",
new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
AccumulateEvent e = list.get(i);
StatisticsAccumulateInfo info = e.getInfo();
ps.setString(1, e.getDeviceId());
ps.setInt(2, info.getYearKey());
ps.setInt(3, info.getMonthKey());
ps.setInt(4, info.getDayKey());
ps.setString(5, e.getUploadValue());
ps.setDouble(6, e.getIncrementToday());
ps.setLong(7, info.getUploadAt());
ps.setString(8, e.getAttrCode());
}
@Override
public int getBatchSize() {
return list.size();
}
}
StringBuilder insertSql = new StringBuilder(
"INSERT INTO dashboard_record_accumulate " +
"(device_id, date_year, date_month, date_day, date_hour, date_minute, date_second, " +
"upload_value, increment_today, increment_minute, upload_at, attr_code) VALUES "
);
List<Object> insertParams = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
AccumulateEvent e = list.get(i);
StatisticsAccumulateInfo info = e.getInfo();
insertSql.append("(?,?,?,?,?,?,?,?,?,?,?,?)");
if (i < list.size() - 1) {
insertSql.append(",");
}
insertParams.add(e.getDeviceId());
insertParams.add(info.getYearKey());
insertParams.add(info.getMonthKey());
insertParams.add(info.getDayKey());
insertParams.add(info.getHourKey());
insertParams.add(info.getMinuteKey());
insertParams.add(info.getSecondKey());
insertParams.add(e.getUploadValue());
insertParams.add(e.getIncrementToday() != null ? e.getIncrementToday() : 0D);
insertParams.add(e.getIncrementMinute() != null ? e.getIncrementMinute() : 0D);
insertParams.add(info.getUploadAt());
insertParams.add(e.getAttrCode());
}
auroraJdbcTemplate.update(insertSql.toString(), insertParams.toArray());
//实时表
StringBuilder updateSql = new StringBuilder(
"INSERT INTO dashboard_realtime_accumulate_day " +
"(device_id, date_year, date_month, date_day, upload_value, increment_today, upload_at, attr_code) VALUES "
);
List<Object> updateParams = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
AccumulateEvent e = list.get(i);
StatisticsAccumulateInfo info = e.getInfo();
updateSql.append("(?,?,?,?,?,?,?,?)");
if (i < list.size() - 1) updateSql.append(",");
updateParams.add(e.getDeviceId());
updateParams.add(info.getYearKey());
updateParams.add(info.getMonthKey());
updateParams.add(info.getDayKey());
updateParams.add(e.getUploadValue());
updateParams.add(e.getIncrementToday());
updateParams.add(info.getUploadAt());
updateParams.add(e.getAttrCode());
}
updateSql.append(" ON DUPLICATE KEY UPDATE ")
.append("upload_value = VALUES(upload_value), ")
.append("increment_today = VALUES(increment_today), ")
.append("upload_at = VALUES(upload_at)");
auroraJdbcTemplate.update(updateSql.toString(), updateParams.toArray());
}
}

Loading…
Cancel
Save