From eefd9078669a5e62fea57c9234ee5350089037b5 Mon Sep 17 00:00:00 2001 From: SerLiunx-ctrl <17689543@qq.com> Date: Wed, 20 Nov 2024 13:08:38 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=88=9D=E5=A7=8B=E5=8C=96SQLite?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ddns/constant/SystemConstants.java | 5 ++ .../core/factory/DatabaseInstanceFactory.java | 17 ++++- .../factory/PersistentInstanceFactory.java | 21 +++++ .../ddns/support/sqlite/SQLiteConnector.java | 76 +++++++++++++++++++ .../com/serliunx/ddns/test/FactoryTest.java | 8 ++ 5 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/serliunx/ddns/core/factory/PersistentInstanceFactory.java create mode 100644 src/main/java/com/serliunx/ddns/support/sqlite/SQLiteConnector.java diff --git a/src/main/java/com/serliunx/ddns/constant/SystemConstants.java b/src/main/java/com/serliunx/ddns/constant/SystemConstants.java index 30ad7cc..a94e894 100644 --- a/src/main/java/com/serliunx/ddns/constant/SystemConstants.java +++ b/src/main/java/com/serliunx/ddns/constant/SystemConstants.java @@ -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"; } diff --git a/src/main/java/com/serliunx/ddns/core/factory/DatabaseInstanceFactory.java b/src/main/java/com/serliunx/ddns/core/factory/DatabaseInstanceFactory.java index 6f1e0cf..5f8ff4b 100644 --- a/src/main/java/com/serliunx/ddns/core/factory/DatabaseInstanceFactory.java +++ b/src/main/java/com/serliunx/ddns/core/factory/DatabaseInstanceFactory.java @@ -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 load() { + Assert.notNull(connector, "数据库连接不能为空!"); + connector.refresh(); return Collections.emptySet(); } + + @Override + public boolean save(Instance instance) { + return false; + } } diff --git a/src/main/java/com/serliunx/ddns/core/factory/PersistentInstanceFactory.java b/src/main/java/com/serliunx/ddns/core/factory/PersistentInstanceFactory.java new file mode 100644 index 0000000..e50fe3c --- /dev/null +++ b/src/main/java/com/serliunx/ddns/core/factory/PersistentInstanceFactory.java @@ -0,0 +1,21 @@ +package com.serliunx.ddns.core.factory; + +import com.serliunx.ddns.core.instance.Instance; + +/** + * 可持久化的实例工厂, 支持编辑、保存实例数据. + * + * @author SerLiunx + * @version 1.0.3 + * @since 2024/11/20 + */ +public interface PersistentInstanceFactory extends InstanceFactory { + + /** + * 保存实例信息 + * + * @param instance 实例 + * @return 成功保存返回真, 否则返回假. + */ + boolean save(Instance instance); +} diff --git a/src/main/java/com/serliunx/ddns/support/sqlite/SQLiteConnector.java b/src/main/java/com/serliunx/ddns/support/sqlite/SQLiteConnector.java new file mode 100644 index 0000000..ce79f19 --- /dev/null +++ b/src/main/java/com/serliunx/ddns/support/sqlite/SQLiteConnector.java @@ -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 SerLiunx + * @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; + } +} diff --git a/src/test/java/com/serliunx/ddns/test/FactoryTest.java b/src/test/java/com/serliunx/ddns/test/FactoryTest.java index 353778a..80635c9 100644 --- a/src/test/java/com/serliunx/ddns/test/FactoryTest.java +++ b/src/test/java/com/serliunx/ddns/test/FactoryTest.java @@ -2,10 +2,12 @@ package com.serliunx.ddns.test; import com.serliunx.ddns.constant.InstanceType; 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.ListableInstanceFactory; import com.serliunx.ddns.core.factory.YamlFileInstanceFactory; import com.serliunx.ddns.core.instance.Instance; +import com.serliunx.ddns.support.sqlite.SQLiteConnector; import org.junit.Test; import java.util.Map; @@ -28,4 +30,10 @@ public class FactoryTest { System.out.println(k + ": " + v); }); } + + @Test + public void testDatabaseFactory() { + ListableInstanceFactory factory = new DatabaseInstanceFactory(SQLiteConnector.getInstance()); + factory.refresh(); + } }