高并发环境下生成唯一流水号

在高并发环境下,确保流水号唯一性的两种主要方法:一是依赖数据库自增主键,二是各节点独立生成无冲突流水号。数据库方法耗时较长,而独立生成可通过MAC地址、时间戳、随机数或线程ID结合避免冲突。对于超过128位的数字,可能需要使用MD5加密成128位。
摘要由CSDN通过智能技术生成

高并发环境下生成唯一流水号的主要思路有两种:

  第一种是有一个控制全局的变量确保每个流水号的唯一性;

  第二种是每台机器根据算法自己生成在系统中无冲突的流水号;

假设流水号的长度是128位(16字节);

第一种实现方法:(1)采用数据库的自增主键确保唯一性;

Database.java

package mine;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Database {
    static String serialNumber;
    static String username="root";
    static String pwd = "123";
    static String url = "jdbc:mysql://192.168.1.6:3306/serialnumber"; 
    static String driver = "org.gjt.mm.mysql.Driver";
    private Connection con;
    private Statement statement;
    public static void main(String[] args){
        serialNumber =new Database().getSerialNumber();
        System.out.println(serialNumber);
    }
    private void start(){
        try {
            Class.forName( driver );
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            System.out.println("error in loading driver.");
        }
        
        long time=10000;
        while((con)==null&&time>0){
    //设置超时时间10s
            try {
                Thread.sleep(100);
                time-=100;    
                con = DriverManager.getConnection(url,username,pwd);
            }catch(Exception e){}
        }
        time=1000;
        while((statement)==null&&time>0){
            try{
                Thread.sleep(100);
                time-=100;    
                statement = con.createStatement();
            }catch(Exception e){}
        }           
    }
    private void close(){
        try {
            if(statement!=null)
                statement.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            System.out.println("error in close statement.");
        } 
        try {
            if(con!=null)
                con.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            System.out.println("error in close connection.");
        }
    }
    public String getSerialNumber(){
        start();
        String str="";
        long time =System.currentTimeMillis();
        try{
            statement.execute("insert serialnumber(time) values("+time+")");
            ResultSet re = statement.executeQuery("select NO from serialnumber where time="+time+
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值