mysql数据库sequence序列表使用记录

2023-11-12

一、需求背景

如何确保一个序列号是按自己定义的规则依次递增?
实际项目需求如下:在商户表有商户费率模板号这个字段,我们要求该字段的规则是:ST+当前日期YYYYMMDD+6位序列号(左边不够是用0填补) 如:TS20200610000001和TS20200610000002
备注:当前字段非自增主键,单我们又要求该字段的值是按照我们约束的规则依次增加!!!!
在一个项目中,这种字段可能会很多,那怎么去很好的解决这种问题呢?

二、如何解决

通常,对于这种需求,我们都会用一个专门的序列表(sequence),表结构如下:

CREATE TABLE `sequence`  (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '记录流水号',
  `seq_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '序列名称',
  `current_value` bigint(20) NOT NULL DEFAULT 0 COMMENT '当前值',
  `increment_value` int(10) UNSIGNED NOT NULL DEFAULT 1 COMMENT '递增值',
  `minimum` bigint(20) NOT NULL DEFAULT 1 COMMENT '最小值ֵ',
  `maximum` bigint(20) NOT NULL DEFAULT 9223372036854775807 COMMENT '最大值ֵ',
  `cycle_flg` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '循环使用标记Y:是N:否',
  `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
  `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '修改时间',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `uq_seqname`(`seq_name`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 71 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'star序列生成表' ROW_FORMAT = Dynamic;

备注:
seq_name序列名称通常是字段名称,如商户费率模板号、服务商号等对应的seq_name分别是TEMP_ID_SEQ和BAGENT_ID
increment_value 字段代表每次的递增值,通常为1
current_value 字段代表当前值 如当前只是1,当经过一次递增之后,当前值变成2,下次生成的值就是3
通过sequence这张表,我们会统一的管理需要按我们自定义要求递增的一个唯一序列

三、项目中如何使用?

1、公共常量类CommonConstants中 定义不够长度依次用0补全、定义目标序列号前缀

    public static final char SEQUENCE_PREFIX = '0';

    public static final String TEMP_ID_SEQ_PREFIX = "ST";

2、实体类、mybatis接口文件和数据库映射文件

@Data
public class SequenceDTO {

    private Long seqId;

    private String seqName;

    private Long currentValue;

    private Long incrementValue;

    private Long minimum;

    private Long maximum;

    private String cycleFlg;

    private Date createTime;

    private Date updTime;
}
@Mapper
public interface SequenceRepository {
    /**
     * 功能描述: 获取指定的序列行,并进行for update的行锁操作
     */
    SequenceDTO getSequenceByIdForUpdate(@Param("seqName") String seqName);

    /**
     * 功能描述: 更新指定的Sequence值
     */
    int updateSequenceById(SequenceDTO sequenceDTO);

    /**
     * 功能描述: 获取全部序列行
     */
    List<SequenceDTO> getAllSequence();

    /**
     * 功能描述: 从mysql获取uuid
     */
    String getUuidFromMysql();
}

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mtx.kyrieboot.sequence.SequenceRepository">
  <resultMap id="BaseResultMap" type="com.mtx.kyrieboot.sequence.SequenceDTO">
    <id column="id" jdbcType="BIGINT" property="seqId" />
    <result column="seq_name" jdbcType="VARCHAR" property="seqName" />
    <result column="current_value" jdbcType="BIGINT" property="currentValue" />
    <result column="increment_value" jdbcType="BIGINT" property="incrementValue" />
    <result column="minimum" jdbcType="BIGINT" property="minimum" />
    <result column="maximum" jdbcType="BIGINT" property="maximum" />
    <result column="cycle_flg" jdbcType="CHAR" property="cycleFlg" />
    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
    <result column="update_time" jdbcType="TIMESTAMP" property="updTime" />
  </resultMap>
  <select id="getSequenceByIdForUpdate" parameterType="java.lang.String" resultMap="BaseResultMap">
    select * from sequence where seq_name = #{seqName,jdbcType=VARCHAR} for update
  </select>

  <select id="getAllSequence" resultMap="BaseResultMap">
    select * from sequence
  </select>

  <update id="updateSequenceById" parameterType="com.mtx.kyrieboot.sequence.SequenceDTO">
    update sequence
    <set>
      <if test="currentValue != null">
        current_value = #{currentValue,jdbcType=BIGINT},
      </if>
      <if test="updTime != null">
        update_time = #{updTime,jdbcType=TIMESTAMP},
      </if>
    </set>
    where seq_name = #{seqName,jdbcType=VARCHAR}
  </update>

  <select id="getUuidFromMysql" resultType="java.lang.String">
    select uuid() as uuid
  </select>

</mapper>

3、序列号工厂类

@Service
@Slf4j
public class MySqlSequenceFactory {

    private final Lock lock = new ReentrantLock();
    private int getRetryNum = 5;
    private Map<String, MySqlSequenceHolder> holderMap = new ConcurrentHashMap<>();
    private int initRetryNum = 5;
    @Autowired
    private SequenceRepository sequenceRepository;
    @Autowired
    private SequenceService sequenceService;

    public long getNextVal(String seqName) {
        log.info("开始获取{}序列值", seqName);
        MySqlSequenceHolder holder = holderMap.get(seqName);
        if (holder == null) {
            log.warn("获取{}序列值出现异常,指定sequenceHolder在map中不存在,开始重新获取操作", seqName);
            try {
                lock.lock();
                holder = holderMap.get(seqName);
                if (holder != null) {
                    return holder.getNextVal();
                }
                SequenceRange sequenceRange = new SequenceRange(-1, -1);
                holder = new MySqlSequenceHolder(seqName, sequenceRepository, sequenceService, sequenceRange, initRetryNum, getRetryNum);
                holder.init();
                holderMap.put(seqName, holder);
            } finally {
                lock.unlock();
            }
        }
        long finalLongNum = holder.getNextVal();
        log.info("获取{}序列值完成,获取的值为{}", seqName, finalLongNum);
        return finalLongNum;

    }

    private void init() {
        log.info("开始初始化所有sequence序列");
        initAll();
        log.info("初始化sequence序列完成");
    }

    private void initAll() {
        try {
            lock.lock();
            List<SequenceDTO> sequenceDTOList = sequenceRepository.getAllSequence();
            if (sequenceDTOList == null || sequenceDTOList.size() == 0) {
                throw new SequenceException("The sequenceDTOList is null!");
            }
            for (SequenceDTO SequenceDTO : sequenceDTOList) {
                SequenceRange sequenceRange = new SequenceRange(-1, -1);
                MySqlSequenceHolder holder = new MySqlSequenceHolder(SequenceDTO.getSeqName(), sequenceRepository, sequenceService, sequenceRange, initRetryNum, getRetryNum);
                holder.init();
                holderMap.put(SequenceDTO.getSeqName(), holder);
            }
        } finally {
            lock.unlock();
        }
    }
}

4、MySQL序列生成器

@Slf4j
public class MySqlSequenceHolder {
    private final Lock lock = new ReentrantLock();
    private String seqName;
    private SequenceRepository sequenceRepository;
    private SequenceService sequenceService;
    private SequenceRange sequenceRange;
    private volatile boolean isInitialize = false;
    private int initRetryNum;
    private int getRetryNum;

    public MySqlSequenceHolder(String seqName, SequenceRepository SequenceRepository, SequenceService sequenceService, SequenceRange sequenceRange, int initRetryNum, int getRetryNum) {
        this.seqName = seqName;
        this.sequenceRepository = SequenceRepository;
        this.sequenceService = sequenceService;
        this.sequenceRange = sequenceRange;
        this.initRetryNum = initRetryNum;
        this.getRetryNum = getRetryNum;
    }

    public void init() {
        log.info("开始初始化{}序列", seqName);
        if (isInitialize == true) {
            log.error("初始化{}序列失败,序列已经初始化", seqName);
            throw new SequenceException("[" + seqName + "] the MySqlSequenceHolder has inited");
        }
        if (sequenceRepository == null) {
            log.error("初始化{}序列失败,SequenceRepository对象为空", seqName);
            throw new SequenceException("[" + seqName + "] the SequenceRepository has inited");
        }
        if (sequenceService == null) {
            log.error("初始化{}序列失败,sequenceService", seqName);
            throw new SequenceException("[" + seqName + "] the sequenceService has inited");
        }
        if (StringUtils.isBlank(seqName)) {
            log.error("初始化序列失败,seqName没有置入");
            throw new SequenceException("[" + seqName + "] the seqName has inited");
        }
        initSequenceRecord();
        isInitialize = true;
        log.info("初始化{}序列完成", seqName);
    }


    public long getNextVal() {
        if (isInitialize == false) {
            log.error("获取下一个序列值失败,此序列还未初始化");
            throw new SequenceException("[" + seqName + "] the MySqlSequenceHolder not inited");
        }
        if (sequenceRange == null) {
            log.error("获取下一个序列值失败,此序列区间对象还未初始化");
            throw new SequenceException("[" + seqName + "] the sequenceRange is null");
        }
        long curValue = sequenceRange.getAndIncrement();
        if (curValue == -1) {
            try {
                lock.lock();
                curValue = sequenceRange.getAndIncrement();
                if (curValue != -1) {
                    return curValue;
                }
                sequenceRange = retryRange();
                curValue = sequenceRange.getAndIncrement();
            } finally {
                lock.unlock();
            }
        }
        return curValue;
    }

    public void initSequenceRecord() {
        for (int i = 0; i < initRetryNum; i++) {
            SequenceRange sequenceRangeTmp = sequenceService.getNewSequenceRange(seqName);
            if (sequenceRangeTmp == null) {
                continue;
            } else {
                sequenceRange = sequenceRangeTmp;
                return;
            }
        }
    }

    private SequenceRange retryRange() {
        for (int i = 0; i < getRetryNum; i++) {
            SequenceRange sequenceRangeTmp = sequenceService.getNewSequenceRange(seqName);
            if (sequenceRangeTmp == null) {
                log.error("初始化{}序列异常,无法获取指定的数据", seqName);
                continue;
            } else {
                return sequenceRangeTmp;
            }
        }
        throw new SequenceException("[" + seqName + "] CardSequence update error");
    }
}

5、序列区间,用于缓存序列

public class SequenceRange {

    /**
     * 最小值
     */
    private final long min;
    /**
     * 最大值
     */
    private final long max;
    /**
     * 当前值
     */
    private final AtomicLong value;
    /**
     * 是否超限
     */
    private volatile boolean over = false;

    public SequenceRange(long min, long max) {
        this.min = min;
        this.max = max;
        this.value = new AtomicLong(min);
    }

    public long getAndIncrement() {
        long currentValue = value.getAndIncrement();
        if (min == -1 || max == -1 || currentValue > max) {
            over = true;
            return -1;
        }
        return currentValue;
    }
}

6、异常

public class SequenceException extends RuntimeException {

    private static final long serialVersionUID = -6896586285280037814L;

    public SequenceException() {
        super();
    }

    public SequenceException(String s) {
        super(s);
    }

    public SequenceException(String message, Throwable cause) {
        super(message, cause);
    }

    public SequenceException(Throwable cause) {
        super(cause);
    }
}

7、序列号服务类

@Service
@Slf4j
public class SequenceService {

    @Autowired
    private SequenceRepository sequenceRepository;
    private static final long overLong = 8223372036854775807L;
    @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
    public SequenceRange getNewSequenceRange(String seqName) {
        log.info("开始获取序列{}的数据", seqName);
        SequenceRange sequenceRange;
        SequenceDTO sequenceDTO = sequenceRepository.getSequenceByIdForUpdate(seqName);
        if (sequenceDTO == null) {
            return null;
        } else {
            if ("N".equals(sequenceDTO.getCycleFlg()) && sequenceDTO.getCurrentValue().equals(sequenceDTO.getMaximum())) {
                log.error("获取{}的数据失败,序列已经使用完,请速度重新设计解决方案", seqName);
                return null;
            } else {
                long newMinValue = sequenceDTO.getCurrentValue();
                long newMaxValue = sequenceDTO.getCurrentValue() + sequenceDTO.getIncrementValue();
                if (newMaxValue > sequenceDTO.getMaximum()) {
                    newMaxValue = sequenceDTO.getMaximum();
                    /*新的起始值*/
                    if ("Y".equals(sequenceDTO.getCycleFlg())) {
                        sequenceDTO.setCurrentValue(1L);
                    } else {
                        sequenceDTO.setCurrentValue(sequenceDTO.getMaximum());
                    }
                } else {
                    /*新的起始值*/
                    sequenceDTO.setCurrentValue(newMaxValue);
                }
                /*最后更新时间*/
                if (sequenceDTO.getCurrentValue() > overLong) {
                    log.error("{}序列已经只剩10^19次方个,请及时分配新的,请速度重新设计解决方案", seqName);
                }
                sequenceDTO.setUpdTime(new Date());
                int result = sequenceRepository.updateSequenceById(sequenceDTO);
                if (result > 0) {
                    log.info("获取序列{}的数据成功,新的序列范围为[{},{}]", seqName, newMinValue, newMaxValue - 1);
                    sequenceRange = new SequenceRange(newMinValue, newMaxValue - 1);
                    return sequenceRange;
                } else {
                    log.error("获取{}的数据失败,数据库中没有查询到此数据", seqName);
                    return null;
                }
            }
        }
    }

}

8、生成各种Sequence序列

@Service
@Slf4j
public class SequenceClient {

    @Autowired
    MySqlSequenceFactory mySqlSequenceFactory;

    /**
     * 功能描述: 获取新的序列号
     */
    public String getSeqNo(String seqName,String prefix,int len){
        log.info("准备获取新的{}序列号",seqName);
        Long initNum = mySqlSequenceFactory.getNextVal(seqName);
        StringBuffer stringBuffer = new StringBuffer(prefix);
        stringBuffer.append(StringUtil.leftPad(String.valueOf(initNum), len, CommonConstants.SEQUENCE_PREFIX));
        String newCashTokenNo = stringBuffer.toString();
        log.info("获取新的{}序列号成功,编号为{}", seqName, newCashTokenNo);
        return newCashTokenNo;

    }
    /**
     * 功能描述: 获取新的序列号
     */
    public String getSeqNoEnum(SequenceEnum seqName, String prefix) {
        log.info("准备获取新的{}序列号", seqName.getCode());
        Long initNum = mySqlSequenceFactory.getNextVal(seqName.getCode());
        StringBuffer stringBuffer = new StringBuffer(prefix);
        stringBuffer.append(StringUtil.leftPad(String.valueOf(initNum), seqName.getLen(), CommonConstants.SEQUENCE_PREFIX));
        String newCashTokenNo = stringBuffer.toString();
        log.info("获取新的{}序列号成功,编号为{}", seqName.getCode(), newCashTokenNo);
        return newCashTokenNo;
    }
}

四、单元测试

@Test
    public void 唯一序列验证(){
        //商户费率模板号要求  TS+当前日期YYYYMMDD+6位序列号  如TS20200610000001
        String prefix = CommonConstants.TEMP_ID_SEQ_PREFIX+DateUtil.getCurrentDate();
        String tempId = sequenceClient.getSeqNo(KeyConstants.TEMP_ID_SEQ,prefix,6);
        System.err.println("运行结果:"+tempId);
    }

运行结果:
在这里插入图片描述
生成序列号后,该序列号的当前值:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql数据库sequence序列表使用记录 的相关文章

  • 是否有任何理由使用 ZoneId.of("UTC") 而不是 ZoneOffset.UTC ?

    有什么理由使用ZoneId of UTC 代替ZoneOffset UTC 我们知道两者之间的区别 如ZoneOffset UTC 和 ZoneId of UTC 之间有什么区别 https stackoverflow com questi
  • Android Fabric Crashlytics 崩溃,初始化时未找到资源

    我从 google play 控制台收到了这份报告 看起来 Fabric 在启动时崩溃了 因为某些用户出现了资源未找到的异常 java lang RuntimeException at android app ActivityThread
  • 竞争条件和 Clojure Atoms

    clojure atom 的文档指出 Changes to atoms are always free of race conditions 然而 竞争条件不仅是根据更改定义的 而且是在不同线程中并行逻辑操作的上下文中定义的 我想知道 保证
  • 如何使用Gson将JSONArray转换为List?

    在我的 Android 项目中 我试图将收到的 JSONArray 转换为列表 在 的帮助下这个答案 https stackoverflow com questions 8371274 how to parse json array in
  • PHP 和 MySql 检查表是否为空

    我有点菜鸟 而且我很难过 我需要一些代码来搜索数据库表以查找与 id 变量匹配的行 我需要抓取该表 描述 中的一个字段 如果它为空 我需要显示一条消息 如果不是另一条消息 这是我的代码 我知道我需要添加 mysqli 转义字符串 只需从内存
  • 基于磁盘的 HashMap [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Java 是否有 或者是否有可用的库 允许我拥有基于磁盘的 HashMap 它不需要是原子的或任何东西
  • 更改JavaFX TableView字体大小[重复]

    这个问题在这里已经有答案了 您好 我想在表视图列内的文本上设置字体 我如何用 Java 做到这一点 这是我的代码 感谢帮助 private final TableView
  • SFTP Java - 管道关闭 Jsch 异常

    我正在研究一种 java 方法 将文件从一个位置复制到另一个远程位置 我的代码如下 我尝试使用jsch 0 1 42 0 1 50 0 1 54 public static void processFiles ArrayList
  • SQL 未插入到 Yii 中具有关系的表中

    我正在尝试创建一个用户 但所有值都没有插入到数据库中 Systems user 表与partys 表有关系 因为party id 是sytems user 的主键 没有插入任何内容 甚至没有错误 它只是返回到 创建 页面 这是我的架构 Ta
  • Java 日期和 MySQL 时间戳时区

    我正在编辑一段代码 其基本功能是 timestamp new Date 然后坚持下去timestamp中的变量TIMESTAMPMySQL 表列 然而 通过调试我看到Date显示在正确时区的对象 GMT 1 当持久化在数据库上时 它是GMT
  • 如何在 laravel 中查询 json 列?

    我用的是 Laravel 5 6 我有一块田地 字段的数据类型为json 字段 desc 字段 的值如下所示 code 1 club CHE country ENGLAND code 2 club BAY country GERMANY c
  • 在Android项目中引用(纯java)项目(找不到类)

    我试图在我的 Android 项目中引用一个纯 java 项目 gt Java 项目有一大堆我需要使用的类 哦 正如第一个回复所指出的 我正在使用 eclipse 是的 唯一的问题是 我总是找不到类 XXX 从方法 com example
  • Spring Boot 中的服务限流能力

    有什么办法可以实现Spring中其余服务的服务限制能力 特别是Spring boot 这里的期望是 我的服务暴露于外界 目前每秒 分钟的服务调用数量没有限制 我们希望通过设置限制来控制这一点 我有一个替代选项 通过跟踪并发哈希映射或任何缓存
  • jasper 报告文件中出现错误

    首先 我在 iReport 5 1 0 中创建一个 R D1 jrxml 文件 我执行该报告的 Java 代码如下所示 import java sql Connection import java sql DriverManager imp
  • 如何让 Camel FTP 按需只获取一次

    我对骆驼还很陌生 我一直在尝试让 Camel 根据需要仅通过 FTP 获取单个文件一次 我无法让它发挥作用 这是我尝试过的 让我知道什么是最好的方法以及我的代码有什么问题 1 读取文件后发送一条空消息当收到空消息时 停止路由 from di
  • Java泛型类型参数中的问号是什么意思? [复制]

    这个问题在这里已经有答案了 这是取自斯坦福解析器附带的一些示例的一小段代码 我已经用 Java 进行了大约 4 年的开发 但从未对这种风格的代码应该表示什么有非常深入的理解 List
  • mysql 中的 max(长度(字段))

    如果我说 select max length Name from my table 我得到的结果是 18 但我也想要相关数据 所以如果我说 select max length Name Name from my table 这是行不通的 我
  • 学说 - 获取下一个和上一个记录

    这样我就已经获取了一些记录 我已创建日期字段 现在我想按日期获取下一条和上一条记录 通过以下方式让它工作 qb this gt createQueryBuilder a next qb gt expr gt gt a created dat
  • 优雅地避免 Java 中的 NullPointerException

    考虑这一行 if object getAttribute someAttr equals true 显然这一行是一个潜在的错误 属性可能是null我们会得到一个NullPointerException 因此我们需要将其重构为以下两个选择之一
  • 如何将字符串解析为map

    有一个像A B C D E F这样的字符串 如何将其解析为map 我会使用拆分 String text A B C D E F Map

随机推荐

  • Linux(Centos6.5)下如何解压.zip和.rar文件

    Windows下常见的压缩文件类型是 zip和 rar 在Linux下如何压缩和解压缩呢 1 zip linux下提供了zip和unzip命令 zip是压缩 unzip是解压缩 举例如下 zip myFile zip jpg 将所有jpg文
  • Linux--权限管理

    学习目标 1 Linux权限管理 1 1 用户分类 2 用户类型和访问权限 2 1 理解什么是权限 3 文件类型和权限操作 3 1 修改权限 3 2 关于root 3 3 更改文件拥有者 3 4 修改组权限 3 5 目录权限 3 5 1 粘
  • 基于jsp的学生网上报名系统

    学生网上报名系统分为五大模块 信息查询模块 信息修改模块 信息录入模块和导出印模块以及信息发布模块 其中信息录入模块是进行信息的添加 存储和删除 是系统运行的基础 信息查询模块是学生通过自己的姓名和学号登陆系统 进入报名界面时由系统按照预先
  • 【JS基础】一些个人积累的原生JS编码设计思想,和大家一起开拓下思维

    文章目录 前言 对象配置 链式调用 队列调用 并发执行 条件判断优化 给数据做封装 尝试先写JS再写界面 前言 以下都是我个人遇到的前端JS原生编码设计上的一些案例记录 希望能帮助新手开拓写代码的思想 并且能够结合自己的想法应用在实际的项目
  • 为什么要使用npm

    文章转载自 https zhuanlan zhihu com p 24357770 网上的 npm 教程主要都在讲怎么安装 配置和使用 npm 却不告诉新人 为什么要使用 npm 今天我就来讲讲这个话题 本文目标读者是 不太了解 npm 的
  • 【项目功能模块】SpringBoot+vue实现登录手机验证码

    SpringBoot vue实现登录需要手机验证码 要在Spring Boot和Vue中实现登录需要手机验证码功能 你需要进行以下步骤 后端 Spring Boot 实现 添加相关依赖 在pom xml文件中添加以下依赖
  • KVM添加文件夹存储

    创建基于文件夹的存储池 1 定义一个存储池 virsh pool define as kvm images dir kvm images 2 查看创建的存储池信息 virsh pool list all 3 建立基于文件夹的存储池 virs
  • OPENGL学习(二)OPENGL渲染管线

    Vertex processor 对顶点进行预处理 原始点都是三维的 最终我们看到的点都是二维的 这个映射过程和点的实际位置 和我们从哪个视角去看都有关系 需要通过一系列矩阵调整点的坐标 另外 还需要确定点的颜色 这个和点到镜头的距离和光照
  • 前端与后端通信最简单的三个方式

    在HTML和Java后端之间进行通信通常是通过使用服务器端的技术来实现的 以下是一些常用的方法 使用表单提交 在HTML中 可以使用表单元素来收集用户输入的数据 当用户提交表单时 可以使用POST或GET方法将数据发送到Java后端 在Ja
  • R语言 判别分析:线性判别、K最邻近、有权重的K最邻近、朴素贝叶斯

    关注微信公共号 小程在线 关注CSDN博客 程志伟的博客 class包 提供Knn 函数 kknn包 提供kknn 函数及miete数据集 房租信息 kknn函数 实现有权重的K最近邻 knn函数 实现K最近邻算法 klaR包 提供Navi
  • Spring Boot 实现Mybatis多数据源

    文章目录 Spring Boot 多数据源 1 背景 2 定义数据源 2 1 定义动态数据源 2 3 定义自定义数据源 3 配置数据库链接 4 编写数据源切面 Spring Boot 多数据源 1 背景 项目日产生的数据量比较大 所以规定每
  • 基于FPGA的FFT算法实现

    基于FPGA的FFT算法实现 项目简述 FFT IP的定制及详解 Block Design设计 仿真结果 总结 项目简述 前面的一篇博客我们已经讲解了FFT算法的发展历程 至于FFT的原理感兴趣的同学可以查阅书本数字信号处理 书本上面的知识
  • 1.6 CPU性能公式

    CPU时间 一个程序在CPU上运行的时间 不包括 I O 时间 时钟周期 系统的时间周期越短 相应的CPU性能就越好 程序的时钟周期数 CPU时间 执行程序所需的时钟周期数 X 时钟周期时间 时钟周期时间是时钟频率的倒数 指令周期数 CPI
  • Cross-Domain Adaptive Teacher for Object Detection安装环境以及运行代码

    1 首先在官网上下载代码以及数据集 代码下载如下 git clone URL网址 git clone https github com facebookresearch adaptive teacher git 2 安装环境 这是作者给的r
  • [蓝桥杯]乘积尾零

    核心思路 想要出现0 即2 5 4 5 8 5 4 8又可以分解为2 末尾本来就有0的也可以分解为5 所以我们只需要把这100个数都尽量拆分为因子 2 5 相乘的形式 并统计2 5的个数 然后看一共有多少对 2 5 即可 ok 上ACcod
  • pytorch实现LSTM(附code)

    目录 一 数据集介绍 二 数据预处理 三 python代码实现 参考 最近搞了一个NASA PCoE的IGBT加速老化数据 想基于pytorch框架写一个LSTM模型进行IGBT退化状态的预测 于是有了这篇文章 注 LSTM的原理就不多讲了
  • 我为什么放弃了 LangChain?

    如果你关注了过去几个月中人工智能的爆炸式发展 那你大概率听说过 LangChain 简单来说 LangChain 是一个 Python 和 JavaScript 库 由 Harrison Chase 开发 用于连接 OpenAI 的 GPT
  • 使用scrollIntoView和监听滚动区域子div的相对于视口的顶部的距离,来实现导航定位功能

    一 需求分解 1 滚动左侧内容 关联激活右侧导航节点 2 单击右侧导航节点 右侧相应的段落滚动到可视区顶部 二 关键技术点提前知 技术点1 Element scrollIntoView scrollIntoView 方法会滚动元素的父容器
  • 安装android时遇到的困难

    1 The type org openqa selenium remote http HttpClient Factory cannot be resolv 的解决方法就是更换2 53 0的selenium的jar包 2 在dos中输入an
  • mysql数据库sequence序列表使用记录

    一 需求背景 如何确保一个序列号是按自己定义的规则依次递增 实际项目需求如下 在商户表有商户费率模板号这个字段 我们要求该字段的规则是 ST 当前日期YYYYMMDD 6位序列号 左边不够是用0填补 如 TS20200610000001和T