永久免费自助建站源代码,行业类网站模板,做篮球视频网站,开发cms网站系统项目应用中#xff0c;曾有以下一个场景#xff1a;接口中要求发送一个int类型的流水号#xff0c;由于多线程模式#xff0c;如果用时间戳#xff0c;可能会有重复的情况(当然概率很小)。所以想到了利用一个独立的自增的sequence来解决该问题。当前数据库为#xff1a;m…项目应用中曾有以下一个场景接口中要求发送一个int类型的流水号由于多线程模式如果用时间戳可能会有重复的情况(当然概率很小)。所以想到了利用一个独立的自增的sequence来解决该问题。当前数据库为mysql由于mysql和oracle不太一样不支持直接的sequence所以需要创建一张table来模拟sequence的功能理由sql语句如下第一步创建--Sequence 管理表DROP TABLE IF EXISTS sequence;CREATE TABLE sequence (name VARCHAR(50) NOT NULL,current_value INT NOT NULL,increment INT NOT NULL DEFAULT 1,PRIMARY KEY (name)) ENGINEInnoDB;第二步创建--取当前值的函数DROP FUNCTION IF EXISTS currval;DELIMITER $CREATE FUNCTION currval (seq_name VARCHAR(50))RETURNS INTEGERLANGUAGE SQLDETERMINISTICCONTAINS SQLSQL SECURITY DEFINERCOMMENT BEGINDECLARE value INTEGER;SET value 0;SELECT current_value INTO valueFROM sequenceWHERE name seq_name;RETURN value;END$DELIMITER ;第三步创建--取下一个值的函数DROP FUNCTION IF EXISTS nextval;DELIMITER $CREATE FUNCTION nextval (seq_name VARCHAR(50))RETURNS INTEGERLANGUAGE SQLDETERMINISTICCONTAINS SQLSQL SECURITY DEFINERCOMMENT BEGINUPDATE sequenceSET current_value current_value incrementWHERE name seq_name;RETURN currval(seq_name);END$DELIMITER ;第四步创建--更新当前值的函数DROP FUNCTION IF EXISTS setval;DELIMITER $CREATE FUNCTION setval (seq_name VARCHAR(50), value INTEGER)RETURNS INTEGERLANGUAGE SQLDETERMINISTICCONTAINS SQLSQL SECURITY DEFINERCOMMENT BEGINUPDATE sequenceSET current_value valueWHERE name seq_name;RETURN currval(seq_name);END$DELIMITER ;第五步测试函数功能当上述四步完成后可以用以下数据设置需要创建的sequence名称以及设置初始值和获取当前值和下一个值。INSERT INTO sequence VALUES (TestSeq, 0, 1);----添加一个sequence名称和初始值以及自增幅度SELECT SETVAL(TestSeq, 10);---设置指定sequence的初始值SELECT CURRVAL(TestSeq);--查询指定sequence的当前值SELECT NEXTVAL(TestSeq);--查询指定sequence的下一个值在java代码中可直接创建sql语句查询下一个值这样就解决了流水号唯一的问题。贴出部分代码(已测试通过)public void testGetSequence() {Connection conn JDBCUtils.getConnection(url, userName, password);String sql SELECT CURRVAL(TestSeq);;PreparedStatement ptmt null;ResultSet rs null;try {ptmt conn.prepareStatement(sql);rs ptmt.executeQuery();int count 0;while (rs.next()) {count rs.getInt(1);}System.out.println(count);} catch (SQLException e) {e.printStackTrace();} finally {JDBCUtils.close(rs, ptmt, conn);}}ps在应用中还有一种用java代码去实现模拟自增sequence的方式具体思路是创建一张存放sequence的table然后通过java调用sql语句去查询和修改这个table中指定sequence名称的值这种方式请加上synchronized。具体代码这里就不上传了因为实现了未去测试过。