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

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

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

假设流水号的长度是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+";");
            if(re.next()){
                str=re.getString(1);
            }
            re.close();
        }catch(Exception e){}
        finally{
            close();
        }
        return ""+time+str;
    } 
}
View Code

相关文章:

  • 2022-12-23
  • 2022-01-12
  • 2021-08-09
  • 2022-12-23
  • 2022-12-23
  • 2021-10-09
  • 2021-07-03
猜你喜欢
  • 2021-09-19
  • 2021-09-17
  • 2022-12-23
  • 2022-12-23
  • 2021-10-30
  • 2022-12-23
  • 2022-01-06
相关资源
相似解决方案