成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

免安裝,還原生產環境,運行中切換版本,這不是我認識的MySQL

數據庫 MySQL
MySQL,用了好多年了吧,在你印象里是不是一直都是四平八穩,做為一個基礎組件,也不期待啥了。

 MySQL,用了好多年了吧,在你印象里是不是一直都是四平八穩,做為一個基礎組件,也不期待啥了。

如果說想線下調度,集成測試,想用一個內存數據庫,你可能會說那H2, Derby吧,不都可以嘛。

但差別是你在自己線下時跑了多少不說,但不同的數據庫,不同的特性,可能有些地方無法真正還原線上。為什么不安裝一個?費事,哈哈。

今天咱們介紹的這位,可以理解為嵌入MySQL,免安裝。不同的測試時還可以切換不同的版本,Cool。

使用起來也不費勁,加個 Maven 依賴就行,分分鐘的事兒。

就是它:

  1. <dependency> 
  2.        <groupId>com.wix</groupId> 
  3.        <artifactId>wix-embedded-mysql</artifactId> 
  4.        <version>x.y.z</version> 
  5.        <scope>test</scope> 
  6. </dependency> 

代碼也簡單,直接定義你需要的版本,數據庫信息,把要初始化的SQL 給它,走起。

  1. MysqldConfig config = aMysqldConfig(v5_6_23) //這里是版本 
  2.   .withCharset(UTF8) 
  3.   .withPort(2215) 
  4.   .withUser("user1""pwd2"
  5.   .withTimeZone("Europe/Vilnius"
  6.   .withTimeout(2, TimeUnit.MINUTES) 
  7.   .withServerVariable("max_connect_errors", 666) 
  8.   .build(); 
  9.  
  10. EmbeddedMysql mysqld = anEmbeddedMysql(config) 
  11.   .addSchema("aschema", ScriptResolver.classPathScript("db/001_init.sql")) 
  12.   .start(); 
  13.  
  14. //do work 
  15.  
  16. mysqld.stop(); //optional, as there is a shutdown hook 

這有啥優勢:

  • 測試可以跑在和生產環境基本一致的環境,同樣的版本,同樣的編碼和配置,database/schema/user settings 等等
  • 比安裝一個更容易,想切換版本,改配置也更輕松;
  • 本地每個項目可以使用不同的版本,不同的配置,啥都不用擔心;
  • 對于MySQL的多個版本支持 - 5.5, 5.6, 5.7, 8.0;
  • 多種平臺和環境都支持。

原理

這背后是怎么實現的呢?

咱們是「刨根究底」公眾號,一起來看看。

上面代碼配置之后的 start ,到底 start 了啥?

咱們看下面這幾小段代碼:

  1. protected EmbeddedMysql( 
  2.             final MysqldConfig mysqldConfig, 
  3.             final DownloadConfig downloadConfig) { 
  4.         this.config = mysqldConfig; 
  5.         IRuntimeConfig runtimeConfig = new RuntimeConfigBuilder().defaults(mysqldConfig, downloadConfig).build(); 
  6.         MysqldStarter mysqldStarter = new MysqldStarter(runtimeConfig); 
  7.         localRepository.lock(); 
  8.         try { 
  9.             this.executable = mysqldStarter.prepare(mysqldConfig); 
  10.         } finally { 
  11.             localRepository.unlock(); 
  12.         } 
  13.  
  14.         try { 
  15.             executable.start(); 
  16.             getClient(SCHEMA, mysqldConfig.getCharset()).executeCommands( 
  17.                     format("CREATE USER '%s'@'%%' IDENTIFIED BY '%s';", mysqldConfig.getUsername(), mysqldConfig.getPassword())); 
  18.         } catch (IOException e) { 
  19.             throw new RuntimeException(e); 
  20.         } 
  21.     } 
  1. protected MysqldProcess start( 
  2.             final Distribution distribution, 
  3.             final MysqldConfig config, 
  4.             final IRuntimeConfig runtime) throws IOException { 
  5.         logger.info("Preparing mysqld for startup"); 
  6.         Setup.apply(config, executable, runtime); 
  7.         logger.info("Starting MysqldProcess"); 
  8.         return new MysqldProcess(distribution, config, runtime, this); 
  9.     } 

其實這背后依賴了一個叫embed.process的開源項目,

  1. public AbstractProcess(Distribution distribution, T config, IRuntimeConfig runtimeConfig, E executable) 
  2.       throws IOException { 
  3.     this.config = config; 
  4.     this.runtimeConfig = runtimeConfig; 
  5.     this.executable = executable; 
  6.     this.distribution = distribution; 
  7.     // pid file needs to be set before ProcessBuilder is called 
  8.     this.pidFile = pidFile(this.executable.getFile().executable()); 
  9.  
  10.     ProcessOutput outputConfig = runtimeConfig.getProcessOutput(); 
  11.  
  12.     // Refactor me - to much things done in this try/catch 
  13.     String nextCall=""
  14.     try { 
  15.  
  16.       nextCall="onBeforeProcess()"
  17.  
  18.       onBeforeProcess(runtimeConfig); 
  19.  
  20.       nextCall="newProcessBuilder()"
  21.  
  22.       ProcessBuilder processBuilder = ProcessControl.newProcessBuilder( 
  23.           runtimeConfig.getCommandLinePostProcessor().process(distribution, 
  24.               getCommandLine(distribution, config, this.executable.getFile())), 
  25.           getEnvironment(distribution, config, this.executable.getFile()), true); 
  26.  
  27.  
  28.       nextCall="onBeforeProcessStart()"
  29.  
  30.       onBeforeProcessStart(processBuilder, config, runtimeConfig); 
  31.  
  32.       nextCall="start()"
  33.  
  34.       process = ProcessControl.start(config.supportConfig(), processBuilder); 
  35.  
  36.       nextCall="writePidFile()"
  37.  
  38.       if (process.getPid() != null) { 
  39.         writePidFile(pidFile, process.getPid()); 
  40.       } 
  41.  
  42.       nextCall="addShutdownHook()"
  43.  
  44.       if (runtimeConfig.isDaemonProcess() && !executable.isRegisteredJobKiller()) { 
  45.         ProcessControl.addShutdownHook(new JobKiller()); 
  46.         registeredJobKiller = true
  47.       } 
  48.  
  49.       nextCall="onAfterProcessStart()"
  50.       onAfterProcessStart(process, runtimeConfig); 
  51.     } catch (IOException iox) { 
  52.       stop(); 
  53.       throw iox; 
  54.     } 
  55.   } 

它又操作了什么呢?從名字你也猜到了,它是直接操作進程的,實際在運行時,會下載一個MySQL,然后通過腳本啟停。

 

初次啟動的時候,會直接下載

 

有了這些,在測試的時候就可以和生產環境一樣,啟動時加載初始化SQL腳本,開始你的工作了。

github地址:https://github.com/wix/wix-embedded-mysql

本文轉載自微信公眾號「Tomcat那些事兒」,可以通過以下二維碼關注。轉載本文請聯系Tomcat那些事兒公眾號。

 

責任編輯:武曉燕 來源: Tomcat那些事兒
相關推薦

2010-04-01 10:44:14

MySQL

2016-04-29 19:53:15

2015-02-09 10:00:38

谷歌衛星互聯網

2019-03-21 04:47:20

口令網絡安全數據泄露

2016-12-07 07:17:11

云計算科技新聞早報

2019-04-23 10:30:23

機器學習人工智能計算機

2023-03-03 13:30:18

設計模式編程語言

2016-05-24 17:24:45

云計算

2016-08-23 18:25:47

Linux系統開源

2017-06-13 16:12:49

大型機云計算

2021-05-23 12:05:15

3DAI 人工智能

2018-08-27 10:24:03

UbuntuPHP版本

2018-08-23 09:56:03

Linux程序版本

2017-01-15 10:19:21

2024-10-09 18:39:30

AI諾貝爾物理獎

2025-04-30 00:20:00

OpenAIChatGPTAI聊天

2021-06-24 20:30:38

辦公

2018-12-04 14:15:29

容器誤區開發

2024-09-11 14:02:13

硅谷模式管理者

2020-02-25 15:47:05

ElasticsearLucene地方
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费啪啪 | 午夜伊人 | 久久久久国产精品一区二区 | 蜜臀久久99精品久久久久野外 | www.日本国产 | 久久免费高清视频 | 欧美黄色一区 | 欧美成人一级 | 免费观看的av毛片的网站 | 成人福利影院 | 亚洲精品一区二三区不卡 | 久草资源| 成人在线免费观看 | 国产精品久久久久久久久久久久午夜片 | 91在线视频观看免费 | 男人天堂午夜 | 欧美久久一区二区三区 | 色综合久久久久 | 在线观看成人av | 日韩精品一区二区三区中文在线 | 国产一区二区三区日韩 | 色综合天天天天做夜夜夜夜做 | 国产一区二区三区免费视频 | 久久一区二区三区四区 | 欧美精品一区二区在线观看 | 99久久99| 毛片网在线观看 | 午夜亚洲 | 久久蜜桃av | 欧美中文字幕一区二区三区亚洲 | 综合精品在线 | 日本中文字幕日韩精品免费 | 国产精品欧美一区二区三区不卡 | 一区二区三区视频在线 | 久久综合伊人一区二区三 | 国产jizz女人多喷水99 | 毛片一区二区三区 | 少妇午夜一级艳片欧美精品 | 四虎永久免费黄色影片 | 天天操夜夜操 | 国产在线视频99 |