单线程 | 5线程 | 10线程 | 20线程 | |
MySQL Auto_increment | 340-390 | 277 | 229 | 178 |
Oracle序列 | 714 | 555 | 454 | 454 |
MySQL 单行更新 | 303 | 136 | 66 | 19 |
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class SeqGenerator { private static ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(); private static int currentVal = -1; private static int maxVal = -1; private static int fetchSize = 10000;//每次生成一万个id static{ try { fetchFromDB(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static int getSeq() throws InterruptedException, ExecutionException { Callable<Integer> c = new Callable<Integer>() { @Override public Integer call() throws Exception { int result = currentVal; if (currentVal > maxVal) {//如果当前值>数据库最大值,重新生成id fetchFromDB(); result = currentVal; } currentVal++; return result; } }; Future<Integer> task = singleThreadExecutor.submit(c); return task.get().intValue(); } private static void fetchFromDB() throws Exception { Class.forName("com.mysql.jdbc.Driver"); Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test", "xx", "xx"); connection.setAutoCommit(false); Statement st = connection.createStatement(); ResultSet rs = st.executeQuery("select * from test for update"); rs.next(); currentVal = rs.getInt(1) + 1;//当前值 rs.close(); st.executeUpdate("update test set id=id+" + fetchSize);//更新db中最大值 rs = st.executeQuery("select * from test for update"); rs.next(); maxVal = rs.getInt(1);//最大值 connection.commit(); rs.close(); st.close(); connection.close(); } public static void main(String[] args) throws Exception { int i = 1000000; long start = System.currentTimeMillis(); while (i > 0) { System.out.println(SeqGenerator.getSeq()); i--; } long end = System.currentTimeMillis(); System.out.println(end - start); } }
原文:http://www.cnblogs.com/firstdream/p/5222541.html