同步寫兩個資料庫--多執行緒

壹頁書發表於2016-06-12
接前文
http://blog.itpub.net/29254281/viewspace-2119080/

兩個資料庫假設在不同的伺服器,不同的例項
  1. drop database db1;  
  2. drop database db2;  
  3. create database db1;  
  4. use db1;  
  5. create table t(translog int primary key,ts timestamp default current_timestamp);  
  6.   
  7. create database db2;  
  8. use db2;  
  9. create table t(translog int primary key,ts timestamp default current_timestamp);

如果像前文那樣同步寫兩個庫,
那麼第一個庫的連線和鎖持有時間,都會翻倍.
可以嘗試多執行緒處理

  1. import java.sql.Connection;  
  2. import java.sql.DriverManager;  
  3. import java.sql.PreparedStatement;  
  4. import java.sql.SQLException;  
  5. import java.util.concurrent.CountDownLatch;  
  6. import java.util.concurrent.ExecutorService;  
  7. import java.util.concurrent.Executors;  
  8.   
  9. public class Test {  
  10.   
  11.     private static ExecutorService threadpool = Executors.newFixedThreadPool(10);  
  12.   
  13.     public void shutdown() {  
  14.         threadpool.shutdown();  
  15.     }  
  16.   
  17.     private synchronized static Connection getConnection(String dbName) {  
  18.         String URL = "jdbc:mysql://127.0.0.1:3306/" + dbName;  
  19.         String USERNAME = "xx";  
  20.         String PWD = "xx";  
  21.         Connection con = null;  
  22.         try {  
  23.             Class.forName("com.mysql.jdbc.Driver");  
  24.             con = DriverManager.getConnection(URL, USERNAME, PWD);  
  25.             con.setAutoCommit(false);  
  26.         } catch (SQLException e) {  
  27.         } catch (ClassNotFoundException e) {  
  28.         }  
  29.         return con;  
  30.     }  
  31.   
  32.     public void insertTranslogid(int translogid) {  
  33.         Connection db1 = getConnection("db1");  
  34.         Connection db2 = getConnection("db2");  
  35.         CountDownLatch latch = new CountDownLatch(2);  
  36.   
  37.         Worker worker1 = new Worker(db1, translogid, latch);  
  38.         Worker worker2 = new Worker(db2, translogid, latch);  
  39.         threadpool.submit(worker1);  
  40.         threadpool.submit(worker2);  
  41.   
  42.         try {  
  43.             latch.await();  
  44.         } catch (InterruptedException e1) {  
  45.             e1.printStackTrace();  
  46.         }  
  47.   
  48.         try {  
  49.             if (worker1.isSuccessed() && worker2.isSuccessed()) {  
  50.                 db1.commit();  
  51.                 db2.commit();  
  52.             } else {  
  53.                 db1.rollback();  
  54.                 db2.rollback();  
  55.             }  
  56.             db1.close();  
  57.             db2.close();  
  58.         } catch (SQLException e) {  
  59.             e.printStackTrace();  
  60.         }  
  61.     }  
  62.   
  63.     public static void main(String[] args) throws ClassNotFoundException, SQLException {  
  64.         long start=System.currentTimeMillis();  
  65.         Test t = new Test();  
  66.         for (int i = 0; i <= 500; i++) {  
  67.             t.insertTranslogid(i);  
  68.         }  
  69.         t.shutdown();  
  70.         long end=System.currentTimeMillis();  
  71.         System.out.println((end-start)/1000);  
  72.     }  
  73. }  
  74.   
  75. class Worker implements Runnable {  
  76.     public Worker(Connection con, int translogid, CountDownLatch latch) {  
  77.         this.con = con;  
  78.         this.translogid = translogid;  
  79.         this.latch = latch;  
  80.     }  
  81.   
  82.     private CountDownLatch latch;  
  83.     private Connection con;  
  84.     private int translogid;  
  85.     private boolean successed=false;  
  86.   
  87.     public boolean isSuccessed() {  
  88.         return successed;  
  89.     }  
  90.   
  91.     @Override  
  92.     public void run() {  
  93.         PreparedStatement pt;  
  94.         try {  
  95.             pt = con.prepareStatement("insert into t(translog) values(?)");  
  96.             pt.setInt(1, translogid);  
  97.             pt.execute();  
  98.             successed = true;  
  99.         } catch (SQLException e) {  
  100.             e.printStackTrace();  
  101.             successed = false;  
  102.         } finally {  
  103.             latch.countDown();  
  104.         }  
  105.     }  
  106.   
  107. }  

501個Translog,用時29s
前文的處理時間為32s...似乎提高並不多...

這程式其實放生產,自己也沒有什麼把握.
有時候感覺壓力很大.新單位已經2年了.
資料庫還是一知半解.JAVA程式也忘的差不多了.其實原來JAVA也是一知半解.
希望2016年自己還能有一些突破吧.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-2119274/,如需轉載,請註明出處,否則將追究法律責任。

相關文章