高并发环境下生成唯一流水号的主要思路有两种:
第一种是有一个控制全局的变量确保每个流水号的唯一性;
第二种是每台机器根据算法自己生成在系统中无冲突的流水号;
假设流水号的长度是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+