详解java解决分布式环境中高并发环境下数据插入重复问题

详解java解决分布式环境中高并发环境下数据插入重复问题

2023年7月21日发(作者:)

详解java解决分布式环境中⾼并发环境下数据插⼊重复问题java 解决分布式环境中 ⾼并发环境下数据插⼊重复问题前⾔原因:服务器同时接受到的重复请求

现象:数据重复插⼊ / 修改操作解决⽅案 : 分布式锁对请求报⽂⽣成 摘要信息 + redis 实现分布式锁⼯具类分布式锁的应⽤package t;import til;import pe;import il;import ;import tRequest;import rvletRequest;import p;import ;/** * 并发拦截 * ⾼并发下 过滤掉 相同请求的⼯具 * @author 杨. * */public class ContextLJ { private static final Integer JD = 0; /** * 上锁 使⽤redis 为分布式项⽬ 加锁 * @param sign * @param tiD * @return * @throws Exception */ public static boolean lock(String sign, String tiD) { synchronized (JD) { // 加锁 Jedis jedis = is(); String uTid = (sign); if (uTid == null) { (sign, tiD); (sign, 36); return true; } return false; } } /** * 锁验证 * @param sign * @param tiD * @return */ public static boolean checklock(String sign, String tiD){ Jedis jedis = is(); String uTid = (sign); return (uTid); } /** * 去掉锁 * @param sign * @param tiD */ public static void clent (String sign, String tiD){ if (checklock(sign, tiD)) { Jedis jedis = is(); (sign); } } /** * 获取摘要 * @param request * @return */ public static String getSign(ServletRequest request){ // 此⼯具是将 request中的请求内容 拼装成 key=value&key=value2 的形式 源码在线⾯ Map map = ustMap((HttpServletRequest) request); String sign = null; try { // 这⾥使⽤md5⽅法⽣成摘要 ustMap ⽅法源码就不贴了 sign = equest(map, 5); } catch (Exception e) { tackTrace(); } return sign; }}public static Map getRequstMap(HttpServletRequest req){ Map params = new HashMap(); Map requestParams = ameterMap(); for (Iterator iter = ().iterator(); t();) { String name = (String) (); String[] values = (String[]) (name); String valueStr = ""; for (int i = 0; i < ; i++) { valueStr = (i == - 1) ? valueStr + values[i] : valueStr + values[i] + ","; } (name, valueStr); } return params; }下⾯是过滤器代码对分布式锁的利⽤package ction;import ;import Util;import ctionUtils;import ult;import Code;import tLJ;import ;import t.*;import rvletResponse;import ption;/** * 对事物进⾏控制 并且 避免接⼝ 直接报漏异常信息 * 并且过滤频繁请求 * Created by yangchao on 2016/11/4. */public class TransactionFilter implements Filter { Logger log = ger(ss()); @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse myResp, FilterChain chain) throws IOException, ServletException { String sign = "sign_" + n(request); // ⽣成摘要 String tiD = domString(3) + "_" + tThread().getId(); // 当前线程的⾝份 try {

if (!(sign, tiD)) { ("放弃相同 并发请求" + sign); frequentlyError(myResp); return; } if (!ock(sign, tiD)) { ("加锁验证失败 " + sign + " " + tiD); frequentlyError(myResp); return; } er(request, myResp); // 放⾏ } catch (Exception e) { // 捕获到异常 进⾏异常过滤 ("", e); retrunErrorInfo(myResp); } finally { (sign, tiD); } } /** * 频繁请求 * @param myResp */ private void frequentlyError(ServletResponse myResp) throws IOException { ApiResult re = new ApiResult<>(); ((HttpServletResponse) myResp).setHeader("Content-type", "text/html;charset=UTF-8"); ("稍安勿躁,不要频繁请求"); e(_VERIFY_FAIL); ter().write(new Gson().toJson(re)); } /** * 返回异常信息

* @param myResp */ private void retrunErrorInfo(ServletResponse myResp) throws IOException { ApiResult re = new ApiResult<>(); ("server error"); // 这⾥不必理会 e(E_ERROR); ter().write(new Gson().toJson(re)); } @Override public void destroy() { }}程序本⾝应该还有需要完善的地⽅, 不过经过⼀段时间的测试。 这个解决⽅案还是⽐较可靠的 并发测试 + ⽣产环境上 也没有再出现 重复请求的问题⾮极端情况下 还是很可靠的以上所述是⼩编给⼤家介绍的java解决分布式环境中⾼并发环境下数据插⼊重复问题详解整合,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。在此也⾮常感谢⼤家对⽹站的⽀持!

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1689899410a293277.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信