国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

免安裝,還原生產環境,運行中切換版本,這不是我認識的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

云計算科技新聞早報

2023-03-03 13:30:18

設計模式編程語言

2019-04-23 10:30:23

機器學習人工智能計算機

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技術棧公眾號

久久精品国产一区二区三区| 亚洲少妇激情视频| 亚洲电影一级黄| 69p69国产精品| 7777精品伊人久久久大香线蕉最新版| 亚洲精品美女视频| 快播亚洲色图| 自由日本语热亚洲人| 在线观看亚洲精品福利片| 亚洲一线二线三线视频| 亚洲色欲综合一区二区三区| 999在线观看精品免费不卡网站| 国产国语videosex另类| 激情av综合| 69av成年福利视频| 久久99精品久久久久久园产越南| 欧美成人小视频| 欧美大片91| 久久久之久亚州精品露出| 精品亚洲成人| 亚洲xxxxx电影| 亚洲国产免费| 色女孩综合网| 亚洲欧美高清| 少妇一晚三次一区二区三区| 国产精品一区二区久激情瑜伽| 一级黄色录像免费看| 日本亚洲免费观看| 国产经品一区二区| 在线亚洲a色| 亚洲欧美制服第一页| 成人福利在线| 婷婷激情综合网| 8848hh四虎| 久久久国产精品麻豆| 三上悠亚久久精品| 国产超碰在线一区| 黄色一级片在线看| 国产精品嫩草影院av蜜臀| 人体内射精一区二区三区| 91在线精品秘密一区二区| 97公开免费视频| 国产午夜精品理论片a级大结局| 免费国产黄色网址| 久久你懂得1024| 日韩少妇内射免费播放18禁裸乳| 日产欧产美韩系列久久99| 狠狠色综合色区| 波多野结衣久久精品| 中文字幕成人网| 欧美 另类 交| 国产69精品一区二区亚洲孕妇| 中文av在线播放| 欧美大片免费看| 老司机精品视频导航| 国产一级激情| 中文字幕一区二区三区在线不卡| 欧美在线视频观看| 色a资源在线| 中文字幕一区二区三区四区不卡| 国产精品三区四区| 亚洲精品套图| 亚洲乱码视频| 日韩激情片免费| 亚洲不卡中文字幕无码| 欧美久久一区| 日韩美女激情视频| 成人黄色理论片| 久久精品国产久精国产爱| 五月婷婷深爱五月| 欧美日韩和欧美的一区二区| 国模冰冰炮一区二区| 成人情趣片在线观看免费| 亚洲小说区图片区| 妞干网在线视频观看| 天天操天天干天天综合网| 香蕉成人在线| 国产一区二区在线网站| 99综合电影在线视频| 欧美5-7sexvideos处| 亚洲成人中文字幕| 精品国产美女| 在线观看污视频| 亚洲成人免费在线观看| 免费观看欧美大片| av一区二区三区四区电影| 另类综合日韩欧美亚洲| 国产一区亚洲二区三区| 一区二区三区**美女毛片| 精品国产99久久久久久| 久久亚洲影音av资源网| 91日韩视频| 午夜精品一区二区三区在线观看| 91蜜桃在线免费视频| 无线免费在线视频| 欧美日韩另类一区| 亚洲精品福利电影| 国产不卡视频在线| 精品一区二区免费| 校园春色影音先锋| 自拍偷拍免费精品| 亚洲情侣在线| 国产成人黄色片| 欧美日韩国产丝袜另类| 91av久久| 久久99热精品这里久久精品| 女生裸体视频一区二区三区| 精品少妇人妻av一区二区| 精品一区二区在线看| 亚洲国产精品综合| 久久一区精品| 99爱视频在线观看| 国产精自产拍久久久久久蜜| 91久久香蕉国产日韩欧美9色| 一本色道久久| а√天堂中文资源在线bt| 精品国产一区久久| 狠狠干夜夜操| 99热精品国产| 欧美国产中文字幕| 日韩精品视频一二三| 一区二区三区不卡视频在线观看| 日本aaa在线观看| 日韩一区二区高清| 日本免费一区二区三区四区| 26uuu另类亚洲欧美日本一| 午夜国产一区| 午夜精品久久17c| 影音先锋亚洲电影| 91精品国产91久久久久麻豆 主演| 国产欧美一区二区精品忘忧草 | 欧美日韩亚洲免费| 久久99国产精品麻豆| www99热| 这里只有精品99re| 成人黄色理论片| 91手机在线观看| 国产91精品一区二区| 国产一级电影网| 亚洲护士老师的毛茸茸最新章节| 91精品久久久久久综合五月天| 91精品综合视频| 国产在线看一区| free性欧美1819hd| 亚洲精品720p| 日韩av二区| 欧美h视频在线观看| 亚洲国产精品尤物yw在线观看| 大黄网站在线观看| 日韩av快播网址| 国内精品写真在线观看| 日韩a在线观看| 7777免费精品视频| 国产一区不卡精品| 亚洲第一区视频| 欧美激情一区二区三区在线视频观看 | 久久一区二区三区超碰国产精品| 久草精品在线播放| 亚洲国产日韩欧美在线图片| 欧美欧美黄在线二区| 亚洲乱码日产精品bd在线观看| 欧美视频在线观看一区二区| 亚洲精品3区| 日本一道本久久| 亚洲人成在线观看网站高清| 亚洲久色影视| 成视频年人免费看黄网站| 亚洲精品一区二区三区99| 88国产精品视频一区二区三区| 亚洲 欧美 日韩系列| 中文字幕av一区| 美腿丝袜亚洲色图| 麻豆视频在线观看免费| 91久久嫩草影院一区二区| 亚洲欧洲精品天堂一级| av亚洲一区| 成人免费在线网| 亚洲视频精品在线| 丁香六月综合激情| 国产夫妻在线播放| 日本一区二区三区视频免费看 | 九一国产在线| 91高跟黑色丝袜呻吟在线观看| 亚洲欧洲99久久| 色播一区二区| 麻豆tv在线播放| www.欧美免费| 久久综合色综合88| www.久久99| 一区二区成人网| 日本亚洲欧美三级| 欧美日韩国产一区在线| 国产中文字幕一区二区三区| 国产国产人免费人成免费视频| 91禁外国网站| 亚洲欧美一区二区三区国产精品| 欧洲专线二区三区| 欧美孕妇孕交| 热re99久久精品国产99热| 精品中文视频在线|