跳到主要内容

数据库

星月市集把商品、待寄清单、成交记录、出价、事件、玩家名单与操作记录都存在数据库里(寄出去的邮件存在星月邮箱自己的数据库)。设定在 config.yml 的 database,改了要重启服务器。

三种类型​

type适合说明
sqlite(默认)单服数据存在 plugins/StarAuction/data.db(文件名由 file 决定),不用任何设定
mysql多个子服跨服所有子服连同一个数据库就能跨服,见 跨服设置
mariadb同上服务端有 MariaDB 驱动时使用 MariaDB 驱动,没有时自动用 MySQL 驱动

Paper / Purpur / Folia 本身就带有 SQLite 与 MySQL 驱动,不需要另外安装。服务端缺少驱动时,插件会在控制台说明缺少哪一个并停用自己。

database:
type: mysql
host: 127.0.0.1
port: 3306
database: starauction
username: root
password: ''
parameters: 'useSSL=false&allowPublicKeyRetrieval=true&characterEncoding=utf8&serverTimezone=UTC'
table-prefix: 'sa_'
pool-size: 8

每个键的说明见 config.yml · 数据库。MySQL 的数据库要先建好(建议 utf8mb4),表格由插件自动建立。

连接池(HikariCP)​

插件内置 HikariCP 连接池(已打包在 jar 里,不需要在运行时下载):

  • MySQL / MariaDB:最多 pool-size 条连接(最少 2);预编译语句快取、批量写入;每条连接 30 分钟回收、每 5 分钟保活,避免被 MySQL 的 wait_timeout 或代理的闲置上限断开;断线自动重连。表格使用 InnoDB 与 utf8mb4。
  • SQLite:WAL 模式、单一连接,所有操作依序执行。
  • 所有数据库操作都在插件自己的背景线程执行,不会卡主线程。

表格​

以默认前缀 sa_ 为例:

表格内容
sa_listing商品:类型、状态、卖家、物品数据、数量、价格、货币、出价、一口价、保留价、手续费、税率、上架 / 到期 / 结束时间、子服
sa_stash待寄清单:要寄给玩家的每一笔物品或货币、来源、是否已通知、哪个子服正在寄(lease)、是否已寄出与对应的星月邮箱邮件编号(claimed、mail_id)。1.1.0 以前是领取箱,升级时自动加上新的栏位
sa_trade成交记录:时间、类型、卖家、买家、物品、数量、金额、税、货币、子服(交易记录、成交均价、/sa trades)
sa_bid拍卖的出价记录(出价菜单的「最近出价」)
sa_event事件表:跨服同步用,每次变动一行
sa_players上线过的玩家(名字 ↔ UUID),用来 /sa view、/sa remove、/sa log 离线玩家
sa_log操作记录(/sa log)
sa_meta1.1.0 新增:这套市集的安装编号(寄信编号用,见 跨服设置)

table-prefix 只能用字母、数字与下划线(最多 32 个字)。同一个数据库里想放好几套互不相通的市集时,才需要设不同的前缀。

自动清理​

开服后不久执行一次,之后每 3 小时一次:

内容保留多久设定
事件表10 分钟固定
已寄出的待寄记录30 天mail.keep-sent-days
已结束的商品与它们的出价记录30 天cleanup.finished-listing-days
成交记录365 天cleanup.trade-days(0 = 永久)
操作记录90 天cleanup.log-days(0 = 永久)

上架中的商品与还没寄出的东西永远不会被清理。 寄出去的邮件由星月邮箱保管,按星月邮箱的规则清理(市集寄的邮件默认永不过期)。

备份与搬服​

  • SQLite:整个 plugins/StarAuction/ 资料夹。请在关服后复制;开服中复制时要连同 data.db-wal、data.db-shm 一起复制,否则可能缺少最近的交易。
  • MySQL:备份数据库(例如 mysqldump starauction),以及每个子服的 plugins/StarAuction/(设定、分类、菜单)。
  • token.yml 的授权会绑定机器。换了机器后如果验证失败,控制台会写出原因与本机机器码,照提示到会员中心处理。
从 SQLite 换成 MySQL

不会自动搬移原本 data.db 里的数据。换之前请让玩家先下架商品,并确认待寄的东西都已经寄到星月邮箱(%starauction_stash_items%、%starauction_stash_money% 为 0)。