Class ScriptSqliteDB
java.lang.Object
com.mclds.plugins.scriptengin.storage.ScriptSqliteDB
基于 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 Summary
ConstructorsConstructorDescriptionScriptSqliteDB(File file, String tableName, org.graalvm.polyglot.Context context) -
Method Summary
Modifier and TypeMethodDescriptionvoidclear()voidclose()关闭底层 Connection。返回原始字符串,不反序列化,不接触 Context,任意线程安全。booleanString[]keys()String[]返回以 prefix 开头的所有 key。onGetValue(BiConsumer<String, Long> onGetValue) onSetValue(BiConsumer<String, Long> onSetValue) voidvoid
-
Constructor Details
-
ScriptSqliteDB
-
-
Method Details
-
onSetValue
-
onGetValue
-
set
-
get
-
get
-
getString
返回原始字符串,不反序列化,不接触 Context,任意线程安全。 -
remove
-
has
-
clear
public void clear() -
keys
-
keys
返回以 prefix 开头的所有 key。与原 ScriptMapDB 行为一致:全量扫描 + Java 侧 startsWith 过滤 (字面匹配,不受 SQL LIKE 通配符影响)。 -
close
public void close()关闭底层 Connection。由ScriptEnginPlugin在 reload / onDisable 统一调用; 脚本侧不应手动调用(会影响同 Context 同文件的其他引用者)。
-