org.test4j.module.database.proxy.EmbeddedMysqlConfig Maven / Gradle / Ivy
package org.test4j.module.database.proxy;
import com.wix.mysql.EmbeddedMysql;
import com.wix.mysql.config.AdditionalConfig;
import com.wix.mysql.config.MysqldConfig;
import com.wix.mysql.config.SchemaConfig;
import com.wix.mysql.distribution.Version;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
import static com.wix.mysql.config.Charset.UTF8;
import static com.wix.mysql.config.DownloadConfig.aDownloadConfig;
import static com.wix.mysql.config.MysqldConfig.aMysqldConfig;
import static com.wix.mysql.config.ProxyFactory.aHttpProxy;
import static org.test4j.module.database.config.DbConfig.instance;
/**
* EmbeddedMysqlCreator: 启动/停止 EmbeddedMysql
*
* @author darui.wu
*/
@SuppressWarnings({"unused"})
public class EmbeddedMysqlConfig {
private static final Map started = new ConcurrentHashMap<>();
public final Version version;
public final int port;
public final String schema;
public final String userName = "test";
public final String password = "password";
public EmbeddedMysqlConfig() {
this(instance().embeddedMysqlVersion(), instance().embeddedMysqlPort(), "ut");
}
public EmbeddedMysqlConfig(Version version, int port, String schema) {
this.version = version;
this.port = port;
this.schema = schema;
}
public EmbeddedMysqlConfig start() {
start(this);
return this;
}
private static synchronized void start(EmbeddedMysqlConfig creator) {
if (started.containsKey(creator.schema)) {
return;
}
// mysql版本
MysqldConfig config = getMysqlConfig(creator);
SchemaConfig schemaConfig = SchemaConfig.aSchemaConfig(creator.schema).build();
AdditionalConfig[] configs = getDownloadConfig();
EmbeddedMysql mysql = EmbeddedMysql.anEmbeddedMysql(config, configs).addSchema(schemaConfig).start();
started.put(creator.schema, mysql);
Runtime.getRuntime().addShutdownHook(new Thread(() -> stop(creator.schema)));
}
private static AdditionalConfig[] getDownloadConfig() {
String host = instance().embeddedMysqlRemoteHost();
if (host.trim().isEmpty()) {
return new AdditionalConfig[0];
} else {
int port = instance().embeddedMysqlRemotePort();
AdditionalConfig config = aDownloadConfig().withProxy(aHttpProxy(host, port)).build();
return new AdditionalConfig[]{config};
}
}
private static MysqldConfig getMysqlConfig(EmbeddedMysqlConfig creator) {
return aMysqldConfig(creator.version)
.withCharset(UTF8)
.withPort(creator.port)
.withUser(creator.userName, creator.password)
.withTimeZone("Asia/Shanghai")
.withTimeout(2, TimeUnit.MINUTES)
.withServerVariable("max_connect_errors", 100)
.build();
}
public static void stop() {
Iterator> it = started.entrySet().iterator();
while (it.hasNext()) {
it.next().getValue().stop();
it.remove();
}
}
public static void stop(String schema) {
if (started.containsKey(schema)) {
started.get(schema).stop();
started.remove(schema);
}
}
public String url() {
return String.format("jdbc:mysql://localhost:%d/%s" +
"?characterEncoding=UTF-8" +
"&zeroDateTimeBehavior=convertToNull" +
"&allowMultiQueries=true",
this.port, this.schema);
}
}