Commit f942cc88 authored by xiaoguang.xu's avatar xiaoguang.xu

userDetailHash数据补充

parent 257e66d7
package cn.quantgroup.xyqb.controller.external;
import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.entity.UserDetail;
import cn.quantgroup.xyqb.entity.UserHashMapping;
import cn.quantgroup.xyqb.model.JsonResult;
import cn.quantgroup.xyqb.repository.IUserDetailRepository;
import cn.quantgroup.xyqb.repository.IUserHashMappingRepository;
import cn.quantgroup.xyqb.repository.IUserRepository;
import cn.quantgroup.xyqb.util.encrypt.MD5Util;
import com.google.common.base.Stopwatch;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
......@@ -25,14 +30,20 @@ public class SyncHashController {
private Boolean isContinue = false;
@Autowired
private IUserRepository userRepository;
private ExecutorService executorService = Executors.newSingleThreadExecutor();
@Autowired
private IUserHashMappingRepository userHashMappingRepository;
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
private IUserDetailRepository userDetailRepository;
/**
* 发起同步
*
......@@ -49,25 +60,41 @@ public class SyncHashController {
while (isContinue) {
Stopwatch started = Stopwatch.createStarted();
Long endPosition = startPosition + step;
List<User> users = userRepository.findByIdBetween(startPosition, endPosition);
if (users.isEmpty()) {
List<UserDetail> userDetails = userDetailRepository.findByIdBetween(startPosition, endPosition);
if (userDetails.isEmpty()) {
log.info("没有数据了. 结束了");
return;
}
log.info("查询用户需要的时间 : {}ms", started.elapsed(TimeUnit.MILLISECONDS));
users.forEach(user -> {
UserHashMapping userHashMapping = userHashMappingRepository.findByUserId(user.getId());
if (userHashMapping != null) {
return;
List<UserHashMapping> userHashMappings = new ArrayList<>();
userDetails.forEach(userDetail -> {
UserHashMapping userHashMapping = new UserHashMapping();
userHashMapping.setUserId(userDetail.getUserId());
userHashMapping.setIdNoMd5(MD5Util.build(userDetail.getIdNo()));
userHashMappings.add(userHashMapping);
});
log.info("遍历计算md5&crc32需要的时间 : {}ms", started.elapsed(TimeUnit.MILLISECONDS));
started = started.reset().start();
String sql = "UPDATE `user_hash_mapping` SET `id_no_md5` = ?, `id_no_md5_short` = ? WHERE `user_id` = ?;";
jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
UserHashMapping userHashMapping = userHashMappings.get(i);
ps.setString(1, userHashMapping.getIdNoMd5());
ps.setLong(2, userHashMapping.getIdNoMd5Short());
ps.setLong(3, userHashMapping.getUserId());
}
@Override
public int getBatchSize() {
return userHashMappings.size();
}
userHashMapping = new UserHashMapping();
userHashMapping.setUserId(user.getId());
userHashMapping.setPhoneNoMd5(MD5Util.build(user.getPhoneNo()));
userHashMappingRepository.saveAndFlush(userHashMapping);
});
log.info("batchUpdate需要的时间 : {}ms", started.elapsed(TimeUnit.MILLISECONDS));
log.info("来一波,start:{},end:{}", startPosition, endPosition);
startPosition = users.get(users.size() - 1).getId() + 1;
startPosition = userDetails.get(userDetails.size() - 1).getId() + 1;
try {
Thread.sleep(250);
......
package cn.quantgroup.xyqb.repository;
import java.util.List;
import cn.quantgroup.xyqb.entity.UserDetail;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
......@@ -9,7 +8,7 @@ import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.transaction.annotation.Transactional;
import cn.quantgroup.xyqb.entity.UserDetail;
import java.util.List;
/**
* @author mengfan.feng
......@@ -61,4 +60,6 @@ public interface IUserDetailRepository extends JpaRepository<UserDetail, Long>,
@Query(value = "select * from user_detail where phone_no like ?1 and id_no like ?2", nativeQuery = true)
List<UserDetail> fuzzyQueryByPhoneNoAndIdNo(String phoneNo, String idNo);
List<UserDetail> findByIdBetween(Long id, Long endId);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment