Class ScriptSqliteDB

java.lang.Object
com.mclds.plugins.scriptengin.storage.ScriptSqliteDB
All Implemented Interfaces:
Storage<Object>

public class ScriptSqliteDB extends Object implements Storage<Object>
基于 SQLite(WAL 模式)的脚本持久化 KV 存储,替代原 MapDB 实现作为 mclds().db 的底层。

为何弃用 MapDB:MapDB fileDB 是嵌入式单 JVM 存储,开启事务时会获取文件排他锁, 多个子服(各自独立 JVM 进程)同时打开同一绝对路径文件,第二个进程会因文件锁失败。 SQLite 的 WAL 模式原生支持「多进程并发读 + 单写」,同机多个子服通过同一绝对路径文件共享数据时 不会因文件锁互相阻塞,且崩溃安全(WAL + synchronous=NORMAL)。

序列化策略与原 ScriptMapDB 一致:

  • set 用 fastjson2 将值序列化为 JSON 字符串存储(不接触 GraalJS Context,任意线程安全);
  • get 用当前 Context 的 JSON.parse 返回 JS 原生值(接触 Context,建议主线程调用)。

线程安全:单一 JDBC Connection 非线程安全,本类对所有读写方法 synchronized 串行化; 多进程 / 多 Connection 并发由 SQLite 文件锁与 WAL 协调。

底层 Connection 由 ScriptEnginPlugin(context, 规范化文件路径) 缓存, reload / onDisable 统一关闭。脚本侧拿到的包装对象不应手动 close()(会影响同 Context 同文件的其他引用者)。

  • Constructor Details

    • ScriptSqliteDB

      public ScriptSqliteDB(File file, String tableName, org.graalvm.polyglot.Context context)
  • Method Details

    • onSetValue

      public ScriptSqliteDB onSetValue(BiConsumer<String,Long> onSetValue)
    • onGetValue

      public ScriptSqliteDB onGetValue(BiConsumer<String,Long> onGetValue)
    • set

      public void set(String key, Object value)
      Specified by:
      set in interface Storage<Object>
    • get

      public Object get(String key)
      Specified by:
      get in interface Storage<Object>
    • get

      public Object get(String key, Object defaultValue)
    • getString

      public String getString(String key)
      返回原始字符串,不反序列化,不接触 Context,任意线程安全。
    • remove

      public void remove(String key)
      Specified by:
      remove in interface Storage<Object>
    • has

      public boolean has(String key)
      Specified by:
      has in interface Storage<Object>
    • clear

      public void clear()
      Specified by:
      clear in interface Storage<Object>
    • keys

      public String[] keys()
      Specified by:
      keys in interface Storage<Object>
    • keys

      public String[] keys(String prefix)
      返回以 prefix 开头的所有 key。与原 ScriptMapDB 行为一致:全量扫描 + Java 侧 startsWith 过滤 (字面匹配,不受 SQL LIKE 通配符影响)。
    • close

      public void close()
      关闭底层 Connection。由 ScriptEnginPlugin 在 reload / onDisable 统一调用; 脚本侧不应手动调用(会影响同 Context 同文件的其他引用者)。