Browse Source

优化sql

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

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