feat: 初始化SQLite连接.

This commit is contained in:
2024-11-20 13:08:38 +08:00
parent f70db6ef90
commit eefd907866
5 changed files with 126 additions and 1 deletions

View File

@@ -82,4 +82,9 @@ public final class SystemConstants {
* 用户目录下的.yml配置文件
*/
public static final String USER_SETTINGS_YAML_PATH = USER_DIR + File.separator + CONFIG_YAML_FILE;
/**
* 程序数据库
*/
public static final String SQLITE_URL = "jdbc:sqlite:data.db";
}

View File

@@ -1,6 +1,8 @@
package com.serliunx.ddns.core.factory;
import com.serliunx.ddns.core.instance.Instance;
import com.serliunx.ddns.support.Assert;
import com.serliunx.ddns.support.sqlite.SQLiteConnector;
import java.util.Collections;
import java.util.Set;
@@ -12,10 +14,23 @@ import java.util.Set;
* @version 1.0.3
* @since 2024/11/20
*/
public final class DatabaseInstanceFactory extends AbstractInstanceFactory {
public final class DatabaseInstanceFactory extends AbstractInstanceFactory implements PersistentInstanceFactory {
private final SQLiteConnector connector;
public DatabaseInstanceFactory(SQLiteConnector connector) {
this.connector = connector;
}
@Override
protected Set<Instance> load() {
Assert.notNull(connector, "数据库连接不能为空!");
connector.refresh();
return Collections.emptySet();
}
@Override
public boolean save(Instance instance) {
return false;
}
}

View File

@@ -0,0 +1,21 @@
package com.serliunx.ddns.core.factory;
import com.serliunx.ddns.core.instance.Instance;
/**
* 可持久化的实例工厂, 支持编辑、保存实例数据.
*
* @author <a href="mailto:serliunx@yeah.net">SerLiunx</a>
* @version 1.0.3
* @since 2024/11/20
*/
public interface PersistentInstanceFactory extends InstanceFactory {
/**
* 保存实例信息
*
* @param instance 实例
* @return 成功保存返回真, 否则返回假.
*/
boolean save(Instance instance);
}

View File

@@ -0,0 +1,76 @@
package com.serliunx.ddns.support.sqlite;
import com.serliunx.ddns.constant.SystemConstants;
import com.serliunx.ddns.core.Refreshable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* SQLite 数据库连接
*
* @author <a href="mailto:serliunx@yeah.net">SerLiunx</a>
* @version 1.0.3
* @since 2024/11/20
*/
public final class SQLiteConnector implements Refreshable {
private volatile Connection connection;
private final Lock initLock = new ReentrantLock();
private volatile boolean initialized = false;
private static final Logger log = LoggerFactory.getLogger(SQLiteConnector.class);
private static final SQLiteConnector INSTANCE = new SQLiteConnector();
// private-ctor
private SQLiteConnector() {}
@Override
public void refresh() {
init();
}
/**
* 连接初始化
*/
private void init() {
if (initialized) {
log.warn("sql connection already initialized");
return;
}
if (!initLock.tryLock()) {
log.error("sql connection already initialing");
}
try {
log.info("initialing sqlite connection.");
connection = DriverManager.getConnection(SystemConstants.SQLITE_URL);
initialized = true;
log.info("sqlite connection successfully initialized.");
} catch (Exception e) {
initialized = false;
log.error("sql connection initialization exception: ", e);
} finally {
initLock.unlock();
}
}
/**
* 是否已经初始化
*/
public boolean isInitialized() {
return initialized;
}
public static SQLiteConnector getInstance() {
return INSTANCE;
}
}