MySQL。它已经使用了很多年。在您的印象中,它一直很稳定。作为一个基础组件,我不指望它会怎么样。如果您想安排离线、集成测试或使用内存数据库,您可能会说H2、Derby或两者。但是区别不在于你离线跑了多少,而是不同的数据库,不同的特性,可能有些地方是无法真正在线上恢复的。为什么不安装一个?打扰了,呵呵。我们今天介绍的可以理解为无需安装即可嵌入MySQL。不同的测试还可以切换不同的版本,酷。使用简单,只需添加一个Maven依赖,分分钟搞定。就是这样:简单,直接定义你需要的版本,数据库信息,给它要初始化的SQL,就可以了。mysqldConfigconfig=aMysqldConfig(v5_6_23)//这是版本.withCharset(UTF8).withPort(2215).withUser("user1","pwd2").withTimeZone("Europe/Vilnius").withTimeout(2,TimeUnit.MINUTES).withServerVariable("max_connect_errors",666).build();EmbeddedMysqlmysqld=anEmbeddedMysql(config).addSchema("aschema",ScriptResolver.classPathScript("db/001_init.sql")).start();//doworkmysqld。stop();//optional,asthereisashutdownhook这样做的好处是什么:测试可以在与生产环境基本相同的环境中运行,相同的版本,相同的编码和配置,数据库/模式/用户设置,etc.比安装一个更容易,认为切换版本和更改配置也更容易;每个本地项目可以使用不同的版本和不同的配置,因此您不必担心任何事情;支持多个版本的MySQL-5.5、5.6、5.7、8.0;支持多种平台和环境。这背后的原理是如何实现的呢?让我们“一探究竟”公众号,一起来看看吧。上面的代码配置之后的开始,到底开始了啥?我们看下面这几个小段代码:protectedEmbeddedMysql(finalMysqldConfigmysqldConfig,finalDownloadConfigdownloadConfig){this.config=mysqldConfig;IRuntimeConfigruntimeConfig=newRuntimeConfigbuilder().Configmysql().ConfigmysqlBuilder()MysqldStartermysqldStarter=newMysqldStarter(runtimeConfig);localRepository.lock();try{this.executable=mysqldStarter.prepare(mysqldConfig);}finally{localRepository.unlock();}try{executable.start();getClient(SCHEMA,mysqldConfig.getCharset()).executeCommands(format("CREATEUSER'%s'@'%%'IDENTIFIEDBY'%s';",mysqldConfig.getUsername(),mysqldConfig.getPassword()));}catch(IOExceptione){thrownewRuntimeException(e);}}protectedMysqldProcessstart(finalDistributiondistribution,finalMysqldConfigconfig,finalIRuntimeConfigruntime)throwsIOException{logger.info("Preparingmysqldforstartup");Setup.apply(config,executable,runtime);logger.info("StartingMysqldProcess");returnnewMysqldProcess(distribution,config,runtime,this);}其实这背后依赖了一个叫做embed.process的启动项目,publicAbstractProcess(Distributiondistribution,Tconfig,IRuntimeConfigruntimeConfig,Eexecutable)throwsIOException{this.config=config;this.runtimeConfig=runtimeConfig;this.executable=executable;this.distribution=distribution;//pidfileneedstobebeforeProcessBuilderiscalledthis.pidFile=pidFile(this.executable.getFile().executable());ProcessOutputoutputConfig=runtimeConfig.getProcessOutput();//Refactorme-tomuchthingsdoneinthistry/catchStringnextCall="";try{nextCall="onBeforeProcess()";onBeforeProcess(runtimeConfig);nextCall="newProcessBuilder()";ProcessBuilderprocessBuilder=ProcessControl.newProcessBuilder(runtimeConfig.getCommandLinePostProcessor().process(distribution,getCommandLine(distribution,config,this.executable.getFile())),getEnvironment(distribution,config,this.executable.getFile()),true);nextCall="onBeforeProcessStart()";onBeforeProcessStart(processBuilder,config,runtimeConfig);nextCall="start()";process=ProcessControl.start(config.supportConfig(),processBuilder);nextCall="writePidFile()";if(process.getPid()!=null){writePidFile(pidFile,process.getPid());}nextCall="addShutdownHook()";if(runtimeConfig.isDaemonProcess()&&!executable.isRegisteredJobKiller()){ProcessControl.addShutdownHook(newJobKiller());registeredJobKiller=true;}nextCall="onAfterProcessStart()";onAfterProcessStart(process,runtimeConfig);}catch(IOExceptioniox){stop();throwiox;}}它的作用是什么?从名字就可以猜到,它是直接运行流程的,实际运行的时候会下载一个MySQL,然后在脚本第一次启动和停止的时候直接下载。已经在工作了。github地址:https://github.com/wix/wix-embedded-mysql本文转载自微信公众号《Tomcat那些事》,可通过以下二维码关注。转载此文请联系Tomcat那些东西公众号。
