feat: 初始化SQLite连接.
This commit is contained in:
@@ -82,4 +82,9 @@ public final class SystemConstants {
|
|||||||
* 用户目录下的.yml配置文件
|
* 用户目录下的.yml配置文件
|
||||||
*/
|
*/
|
||||||
public static final String USER_SETTINGS_YAML_PATH = USER_DIR + File.separator + CONFIG_YAML_FILE;
|
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";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
package com.serliunx.ddns.core.factory;
|
package com.serliunx.ddns.core.factory;
|
||||||
|
|
||||||
import com.serliunx.ddns.core.instance.Instance;
|
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.Collections;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@@ -12,10 +14,23 @@ import java.util.Set;
|
|||||||
* @version 1.0.3
|
* @version 1.0.3
|
||||||
* @since 2024/11/20
|
* @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
|
@Override
|
||||||
protected Set<Instance> load() {
|
protected Set<Instance> load() {
|
||||||
|
Assert.notNull(connector, "数据库连接不能为空!");
|
||||||
|
connector.refresh();
|
||||||
return Collections.emptySet();
|
return Collections.emptySet();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean save(Instance instance) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,10 +2,12 @@ package com.serliunx.ddns.test;
|
|||||||
|
|
||||||
import com.serliunx.ddns.constant.InstanceType;
|
import com.serliunx.ddns.constant.InstanceType;
|
||||||
import com.serliunx.ddns.constant.SystemConstants;
|
import com.serliunx.ddns.constant.SystemConstants;
|
||||||
|
import com.serliunx.ddns.core.factory.DatabaseInstanceFactory;
|
||||||
import com.serliunx.ddns.core.factory.InstanceFactory;
|
import com.serliunx.ddns.core.factory.InstanceFactory;
|
||||||
import com.serliunx.ddns.core.factory.ListableInstanceFactory;
|
import com.serliunx.ddns.core.factory.ListableInstanceFactory;
|
||||||
import com.serliunx.ddns.core.factory.YamlFileInstanceFactory;
|
import com.serliunx.ddns.core.factory.YamlFileInstanceFactory;
|
||||||
import com.serliunx.ddns.core.instance.Instance;
|
import com.serliunx.ddns.core.instance.Instance;
|
||||||
|
import com.serliunx.ddns.support.sqlite.SQLiteConnector;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@@ -28,4 +30,10 @@ public class FactoryTest {
|
|||||||
System.out.println(k + ": " + v);
|
System.out.println(k + ": " + v);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDatabaseFactory() {
|
||||||
|
ListableInstanceFactory factory = new DatabaseInstanceFactory(SQLiteConnector.getInstance());
|
||||||
|
factory.refresh();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user