高并发环境下生成唯一流水号的主要思路有两种:
第一种是有一个控制全局的变量确保每个流水号的唯一性;
第二种是每台机器根据算法自己生成在系统中无冲突的流水号;
假设流水号的长度是128位(16字节);
第一种实现方法:(1)采用数据库的自增主键确保唯一性;
Database.java
packagemine;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement;public classDatabase {staticString 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";privateConnection con;privateStatement statement;public static voidmain(String[] args){
serialNumber=newDatabase().getSerialNumber();
System.out.println(serialNumber);
}private voidstart(){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 voidclose(){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.");
}
}publicString 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{
clos