美文网首页我爱编程
单机版 mysql 序列 sequence 生成策略

单机版 mysql 序列 sequence 生成策略

作者: 乘以零 | 来源:发表于2018-04-12 13:31 被阅读0次

1. 一个序列对应一张表

每次从数据库取的序列号大小记为n 也可以理解为步长 适当增大可以防止频繁访问数据库

因为mysql的AUTO_INCREMENT步长是全局的,所以,不建议更改步长
CREATE TABLE `SEQ_DEMO` (
  `id` bigint(10) unsigned NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT SEQ_DEMO VALUES(0)
@Test
public void test() throws Exception {
    int n = 1; 
    Connection con = dataSourceWrite.getConnection();
    con.setAutoCommit(false);
    String sql = "update SEQ_DEMO set id = last_insert_id(id + n) ";
    Statement stmt = con.createStatement();
    stmt.executeUpdate(sql);

    String nextSql = "select last_insert_id()";
    ResultSet rs = stmt.executeQuery(nextSql);
    while (rs.next()) {
        Long id = rs.getLong(1);
        System.err.println("now id=" + id);
    }

    con.commit();
    con.close();
}

2.多个序列放在一张表上

1. 建表
-- 也可以在表里面加上步长这个列 然后在函数只传一个参数即可 原理是一样的
CREATE TABLE `REB_SEQ` 
    `seq_name` varchar(50) NOT NULL COMMENT '序列名',
    `curr_value` bigint(20) DEFAULT '0' COMMENT '当前值',
    -- `increment` int(10) DEFAULT '1' COMMENT '步长 默认1',
    PRIMARY KEY (`seq_name`)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8

2.建函数
-- 如果increment在表里面设置 则不需要参数 param_cache_size 
DROP FUNCTION IF EXISTS `fun_next_seq`$$
CREATE DEFINER=`root`@`%` FUNCTION `fun_next_seq`(param_seq_name VARCHAR(50),param_cache_size INT(10)) RETURNS INT(11)
       DETERMINISTIC
  BEGIN  
    DECLARE ret BIGINT(20); 
    UPDATE REB_SEQ SET curr_value = curr_value + param_cache_size WHERE seq_name = param_seq_name;  
    SET ret = 0;
    SELECT curr_value INTO ret FROM REB_SEQ WHERE seq_name = param_seq_name; 
    RETURN ret; 
  END$$
  DELIMITER ;

3. 执行sql
int n = 1;
String seqName = "your seq name";
String sql = "SELECT fun_next_seq(seqName, n)";
...
long id = jdbc.execute(sql)
...

相关文章

网友评论

    本文标题:单机版 mysql 序列 sequence 生成策略

    本文链接:https://www.haomeiwen.com/subject/mohxkftx.html