真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯網站制作重慶分公司

怎么在Spring中使用Mybatis和Mysql搭建一個分布式數據庫訪問框架

這篇文章將為大家詳細講解有關怎么在Spring中使用Mybatis和MySQL搭建一個分布式數據庫訪問框架,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

創(chuàng)新互聯公司是一家集成都做網站、成都網站制作、網站頁面設計、網站優(yōu)化SEO優(yōu)化為一體的專業(yè)網站設計公司,已為成都等多地近百家企業(yè)提供網站建設服務。追求良好的瀏覽體驗,以探求精品塑造與理念升華,設計最適合用戶的網站頁面。 合作只是第一步,服務才是根本,我們始終堅持講誠信,負責任的原則,為您進行細心、貼心、認真的服務,與眾多客戶在蓬勃發(fā)展的市場環(huán)境中,互促共生。

開發(fā)環(huán)境

3.1 下載Spring、Mybatis、Mysql組件。

3.2 Eclipse:Java開發(fā)IDE。引入如下jar包:

怎么在Spring中使用Mybatis和Mysql搭建一個分布式數據庫訪問框架

代碼結構如下:

怎么在Spring中使用Mybatis和Mysql搭建一個分布式數據庫訪問框架

四、構建數據庫集群

在MYSQL中創(chuàng)建11個數據庫(test1/2/3/4/5/6/7/8/9/10/11)創(chuàng)建一個簡單的表:

怎么在Spring中使用Mybatis和Mysql搭建一個分布式數據庫訪問框架

在test1的tbl_Demo表中插入5千萬條數據,其它10個數據庫的tbl_Demo表中分別插入5百萬條數據(用函數)。

在test1的tbl_Demo表中插入5千萬條數據,其它10個數據庫的tbl_Demo表中分別插入5百萬條數據(用函數)。

五、創(chuàng)建Mybatis數據庫映射接口

/**
 * Mybatis 映射接口
 * 
 *
 * @author elon
 * @version 1.0, 2015年10月23日
 */
public interface IDemo 
{ 
 public void insertDemo(DemoDAO demo);
 public List selectGroup();
}
/**
 * 
 * Mybatis 映射服務接口
 *
 * @author elon
 * @version 1.0, 2015年10月23日
 */
public interface IDemoService
{ 
 public void insertDemo(DemoDAO demo);
 public List selectGroup();
}
/**
 * 
 * Mybatis 映射服務實現
 *
 * @author elon
 * @version 1.0, 2015年10月23日
 */
public class DemoServiceImpl implements IDemoService
{
 private IDemo idemo = null;
 public void setIdemo(IDemo idemo) {
  this.idemo = idemo;
 }
 @Override
 public void insertDemo(DemoDAO demo)
 {
  idemo.insertDemo(demo);
 }
 @Override
 public List selectGroup()
 { 
  return idemo.selectGroup();
 }
}

六、創(chuàng)建數據庫標識管理和動態(tài)數據源

/**
 * 
 * 保存數據庫標識。每個線程由獨立的對象存儲
 *
 * @author elon
 * @version 1.0, 2015年10月23日
 */
public class DBIndetifier
{ 
 private static ThreadLocal dbKey = new ThreadLocal();
 public static void setDBKey(final String dbKeyPara)
 { 
  dbKey.set(dbKeyPara);
 }
 public static String getDBKey()
 {
  return dbKey.get();
 }
}
/**
 * 
 * 動態(tài)數據源??筛鶕煌臄祿饕B接不同的數據庫
 *
 * @author elon
 * @version 1.0, 2015年10月23日
 */
public class DynamicDataSource extends AbstractRoutingDataSource
{
 @Override
 public Object determineCurrentLookupKey()
 {
  return DBIndetifier.getDBKey();
 }
}

七、創(chuàng)建數據庫訪問對象

/**
 * 
 * 數據庫訪問對象。用于插入數據。
 *
 * @author elon
 * @version 1.0, 2015年10月23日
 */
public class DemoDAO
{
 private int a;
 private String b;
 private int c;
 public int getA()
 {
  return a;
 }
 public void setA(int a)
 {
  this.a = a;
 }
 public String getB()
 {
  return b;
 }
 public void setB(String b)
 {
  this.b = b;
 }
 public int getC()
 {
  return c;
 }
 public void setC(int c)
 {
  this.c = c;
 }
}
/**
 * 
 * 映射結果定義
 *
 * @author elon
 * @version 1.0, 2015年10月23日
 */
public class DemoResult implements Serializable
{
 /**
  * Comment for serialVersionUID
  *    */  private static final long serialVersionUID = -413001138792531448L;  private long sum;  public long getSum()  {   return sum;  }  public void setSum(long sum)  {   this.sum = sum;  }  @Override  public String toString()  {   return String.valueOf(sum);  } }

八、創(chuàng)建數據庫訪問任務

/**
 * 數據庫訪問任務定義。將每一個對數據庫訪問的請求包裝為一個任務對象,放到任務管理中,
 * 然后等待任務執(zhí)行完成,取出執(zhí)行結果。
 *
 * @author elon
 * @version 1.0, 2015年10月23日
 */
public class DBTask implements Runnable
{ 
 // 操作數據庫標識,用于指定訪問的數據庫。與spring配置文件中的數據動態(tài)數據源定義一致。
 private final String dbKey;
 // mybatis數據庫訪問對象
 private final Object dbAccessObject;
 // mysbatis數據庫訪問方法名稱,用于反射調用
 private final String methodName;
 // 存儲可變參數的值
 private final Object[] paraArray;
 // 存儲可變參數類型
 @SuppressWarnings("rawtypes")
 private final Class[] paraClassArray;
 // 數據庫操作結果。查詢操作返回查詢結果; 插入、刪除、修改操作返回null。
 private Object operateResult;
 // 操作數據庫拋出的異常信息
 private Exception exception;
 // 標識任務是否已經執(zhí)行
 private boolean finish;
 /**
  * 構造函數
  * @param dbKey 數據庫標識
  * @param dbAccessObject 數據庫訪問對象
  * @param methodName 數據庫訪問方法名稱
  * @param paraArray 參數列表
  */
 public DBTask(final String dbKey, final Object dbAccessObject, final String methodName, 
     final Object... paraArray)
 {
  this.dbKey = dbKey;
  this.dbAccessObject = dbAccessObject;
  this.methodName = methodName;
  this.paraArray = paraArray;
  finish = false;
  exception = null;
  paraClassArray = new Class[paraArray.length];
  for (int index = 0; index < paraArray.length; ++index)
  {
   paraClassArray[index] = paraArray[index].getClass();
  }
  operateResult = null;
 }
 /**
  * 
  * 任務執(zhí)行函數
  *
  */
 @Override
 public void run()
 {
  try
  { 
   DBIndetifier.setDBKey(dbKey);
   Method method = dbAccessObject.getClass().getMethod(methodName, paraClassArray);
   // 查詢操作返回查詢結果; 插入、刪除、修改操作返回null
   operateResult = method.invoke(dbAccessObject, paraArray);
  }
  catch (Exception e)
  {
   exception = e;
   e.printStackTrace();
  }
  finish = true;
 }
 /**
  * 
  * 返回操作結果。查詢操作返回查詢結果; 插入、刪除、修改操作返回null
  *
  * @return 操作結果
  */
 public Object getRetValue()
 {
  return operateResult;
 }
 /**
  * 拋出數據庫操作異常
  * 
  * @return 異常
  */
 public Exception getException()
 {
  return exception;
 }
 /**
  * 
  * 返回任務是否已執(zhí)行
  *
  * @return 標記
  */
 public boolean isFinish()
 {
  return finish;
 }
}

九、創(chuàng)建數據庫任務管理器

/**
 * 數據庫訪問任務管理。將數據庫訪問任務放到線程池中執(zhí)行。
 * 
 *
 * @author elon
 * @version 1.0, 2015年10月23日
 */
public class DBTaskMgr
{
 private static class DBTaskMgrInstance
 {
  public static final DBTaskMgr instance = new DBTaskMgr();
 }
 public static DBTaskMgr instance()
 {
  return DBTaskMgrInstance.instance;
 }
 private ThreadPoolExecutor pool;
 public DBTaskMgr()
 {
  pool = new ThreadPoolExecutor(10, 50, 60, TimeUnit.SECONDS,           
          new ArrayBlockingQueue(10000),
          new ThreadPoolExecutor.CallerRunsPolicy());
 }
 public void excute(Runnable task)
 {
  pool.execute(task);
 }
}

十、創(chuàng)建MyBatis配置文件

10.1 mybatis.xml




 
  
 

10.2 demoMapper.xml

 
 
 
 
  insert into tbl_demo(a, b, c) values(#{a}, #, #{c});
 
 
  
 
 
  select sum(a) as sumColum from tbl_demo group by c;
 

十一、創(chuàng)建Spring配置文件

11.1 spring.xml



 
  
  
  
  
  
  
  
  
 
 
  
  
  
  
  
  
  
  
 
 
  
  
  
  
  
  
  
  
 
 
  
  
  
  
  
  
  
  
 
 
  
  
  
  
  
  
  
  
 
 
  
  
  
  
  
  
  
  
 
 
  
  
  
  
  
  
  
  
 
 
  
  
  
  
  
  
  
  
 
 
  
  
  
  
  
  
  
  
 
 
  
  
  
  
  
  
  
  
 
 
  
  
  
  
  
  
  
  
 
 
  
   
    
    
    
    
    
    
    
    
    
    
    
   
  
 
 
  
  
 
 
  
  
 
 
  
 

十二、測試代碼

public class TestMain
{
 /**
  * 測試代碼
  * 
  *
  * @param args
  */
 public static void main(String[] args)
 {
  @SuppressWarnings("resource")
  ApplicationContext context = new ClassPathXmlApplicationContext("cfg/spring.xml");
  IDemoService service1 = (IDemoService)context.getBean("iDemoService");
  // 創(chuàng)建任務對象
  DBTask task1 = new DBTask("test1", service1, "selectGroup");
  DBTask task2 = new DBTask("test2", service1, "selectGroup");
  DBTask task3 = new DBTask("test3", service1, "selectGroup");
  DBTask task4 = new DBTask("test4", service1, "selectGroup");
  DBTask task5 = new DBTask("test5", service1, "selectGroup");
  DBTask task6 = new DBTask("test6", service1, "selectGroup");
  DBTask task7 = new DBTask("test7", service1, "selectGroup");
  DBTask task8 = new DBTask("test8", service1, "selectGroup");
  DBTask task9 = new DBTask("test9", service1, "selectGroup");
  DBTask task10 = new DBTask("test10", service1, "selectGroup");
  DBTask task11 = new DBTask("test11", service1, "selectGroup");
  DemoDAO demo = new DemoDAO();
  demo.setA(10000000);
  demo.setB("12121212");
  demo.setC(100);
  DBTask taskInsert = new DBTask("test2", service1, "insertDemo", demo);
  SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  System.out.println("開始插入數據:" + format.format(new Date()));
  DBTaskMgr.instance().excute(taskInsert);
  while (true)
  {
   if (!taskInsert.isFinish())
   {
    try
    {
     Thread.sleep(1000);
    }
    catch (InterruptedException e)
    {
     e.printStackTrace();
    }
   }
   else
   {
    break;
   }
  }
  System.out.println("插入數據結束:" + format.format(new Date()));
  System.out.println("開始查詢5千萬數據表:" + format.format(new Date()));
  DBTaskMgr.instance().excute(task1);
  while (true)
  {
   if (!task1.isFinish())
   {
    try
    {
     Thread.sleep(1000);
    }
    catch (InterruptedException e)
    {
     e.printStackTrace();
    }
   }
   else
   {
    break;
   }
  }
  System.out.println(task1.getRetValue());
  System.out.println("查詢5千萬數據表結束:" + format.format(new Date()));
  List taskList = new ArrayList();
  taskList.add(task2);
  taskList.add(task3);
  taskList.add(task4);
  taskList.add(task5);
  taskList.add(task6);
  taskList.add(task7);
  taskList.add(task8);
  taskList.add(task9);
  taskList.add(task10);
  taskList.add(task11);
  System.out.println("開始查詢10個5百萬數據表:" + format.format(new Date()));
  for (DBTask task : taskList)
  {
   DBTaskMgr.instance().excute(task);
  }
  while (true)
  {
   int success = 0;
   for (DBTask task : taskList)
   {
    if (!task.isFinish())
    { 
     try
     {
      Thread.sleep(1000);
     }
     catch (InterruptedException e)
     {
      e.printStackTrace();
     }
    }
    else
    {
     ++success;
    }
   }
   if (success == 10)
   {
    break;
   }
  }
  for (DBTask task : taskList)
  {
   System.out.println(task.getRetValue());;
  }
  System.out.println("10個5百萬數據表查詢結束:" +format.format(new Date()));
 }
}

十三、測試結果

怎么在Spring中使用Mybatis和Mysql搭建一個分布式數據庫訪問框架

關于怎么在Spring中使用Mybatis和Mysql搭建一個分布式數據庫訪問框架就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。


文章題目:怎么在Spring中使用Mybatis和Mysql搭建一個分布式數據庫訪問框架
網頁URL:http://weahome.cn/article/psdpho.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部