package org.dayatang.h2;
import org.dayatang.utils.Slf4JLogger;
import org.h2.tools.DeleteDbFiles;
import org.h2.tools.Server;
import java.io.File;
import java.sql.SQLException;
public class H2Server {
private static final Slf4JLogger LOGGER = Slf4JLogger.getLogger(H2Server.class);
private static final String DEFAULT_DB_FILE = "h2-test-db";
private static H2Server instance;
public static final synchronized H2Server getSingleton() {
if (instance == null) {
instance = new H2Server(DEFAULT_DB_FILE);
}
return instance;
}
private Server server;
private String dir;
private String dbFile;
public H2Server(String dir, String dbFile) {
this.dir = dir;
this.dbFile = dbFile;
}
public H2Server(String dbFile) {
this(".", dbFile);
}
public synchronized void start() {
if (server != null && server.isRunning(true)) {
return;
}
try {
DeleteDbFiles.execute(dir, dbFile, true);
server = Server.createTcpServer(new String[0]);
server.start();
LOGGER.info("H2 server started! data file is {}", new File(dir, dbFile).getAbsolutePath());
} catch (SQLException e) {
LOGGER.error("Cannot start h2 server database", e);
throw new RuntimeException("Cannot start h2 server database", e);
}
}
public synchronized void shutdown() {
if (server == null) {
return;
}
if (server.isRunning(true)) {
server.stop();
server.shutdown();
DeleteDbFiles.execute(dir, dbFile, true);
LOGGER.info("H2 server shutdowned!");
}
server = null;
}
}