package tech.powerjob.worker.persistence.db;
|
|
import tech.powerjob.common.utils.CommonUtils;
|
import tech.powerjob.common.utils.JavaUtils;
|
import tech.powerjob.worker.common.constants.StoreStrategy;
|
import com.zaxxer.hikari.HikariConfig;
|
import com.zaxxer.hikari.HikariDataSource;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.io.FileUtils;
|
import org.h2.Driver;
|
import tech.powerjob.worker.common.utils.PowerFileUtils;
|
|
import javax.sql.DataSource;
|
import java.io.File;
|
import java.sql.Connection;
|
import java.sql.SQLException;
|
|
/**
|
* 数据库连接管理
|
*
|
* @author tjq
|
* @since 2020/3/17
|
*/
|
@Slf4j
|
public class ConnectionFactory {
|
|
private volatile DataSource dataSource;
|
|
private final String H2_PATH = PowerFileUtils.workspace() + "/h2/" + CommonUtils.genUUID() + "/";
|
private final String DISK_JDBC_URL = String.format("jdbc:h2:file:%spowerjob_worker_db;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false", H2_PATH);
|
private final String MEMORY_JDBC_URL = String.format("jdbc:h2:mem:%spowerjob_worker_db;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false", H2_PATH);
|
|
public Connection getConnection() throws SQLException {
|
return dataSource.getConnection();
|
}
|
|
public synchronized void initDatasource(StoreStrategy strategy) {
|
|
// H2 兼容性问题较多,前置输出版本方便排查
|
log.info("[PowerDatasource] H2 database version: {}", JavaUtils.determinePackageVersion(Driver.class));
|
|
// 兼容单元测试,否则没办法单独测试 DAO 层了
|
strategy = strategy == null ? StoreStrategy.DISK : strategy;
|
|
HikariConfig config = new HikariConfig();
|
config.setDriverClassName(Driver.class.getName());
|
config.setJdbcUrl(strategy == StoreStrategy.DISK ? DISK_JDBC_URL : MEMORY_JDBC_URL);
|
config.setAutoCommit(true);
|
// 池中最小空闲连接数量
|
config.setMinimumIdle(2);
|
// 池中最大连接数量
|
config.setMaximumPoolSize(32);
|
dataSource = new HikariDataSource(config);
|
|
log.info("[PowerDatasource] init h2 datasource successfully, use url: {}", config.getJdbcUrl());
|
|
// JVM 关闭时删除数据库文件
|
try {
|
FileUtils.forceDeleteOnExit(new File(H2_PATH));
|
log.info("[PowerDatasource] delete worker db file[{}] on JVM exit successfully", H2_PATH);
|
}catch (Throwable t) {
|
log.warn("[PowerDatasource] delete file on JVM exit failed: {}", H2_PATH, t);
|
}
|
}
|
|
}
|