Skip to content

Releases: vfaner/jync

Jync v1.3.1

Choose a tag to compare

@vfaner vfaner released this 26 Sep 03:44

Jync v1.3.1

本版主题是AI 起草提速与界面观感:候选 SQL 流式进编辑器、边生成边可见;模型只回转换后的 CREATE 语句,输出即所得;同一对象重复起草走 10 分钟缓存直接返回。复审页编辑器与对比框新增 SQL 高亮,全站换细滚动条。另修复一处同步稳定性问题:运行中清空目标库不再误报乐观锁错误。

本次更新

AI 起草提速

  • 流式输出:复审页「用 AI 起草」改走流式(SSE),候选边生成边渲染进编辑器,不再等超时才一次性看到全文
  • 缓冲型网关兼容:整段生成完才返回的自建/中转端点自动回退为全文一次渲染;流式超时语义改为「相邻两包间隔超过设定秒数才断开」,首包等待不受该超时限制,慢模型不再被误判超时
  • 块格式自动识别:端点实际返回的块格式与配置的协议(OpenAI / Anthropic)不一致时按行自动识别,仍能正常流式读取
  • 10 分钟起草缓存:同一对象、同一供应商、源定义未变时重复点击立即返回,提示中标注(缓存命中);源定义或模型变了自动失效
  • 输出更直接:模型只回复转换后的 CREATE 语句(无说明文字、无 JSON 包装),编辑器原样呈现;起草完成后页面给一条提醒 —— AI 输出仅为候选,保存为覆盖前请先在目标库人工自测

界面

  • SQL 高亮:复审页的覆盖编辑器与「原始定义 / 自动转换」对比框对关键字、字符串、数字、注释分区着色,风格参照 DBeaver
  • 细滚动条:全站滚动条改细、彩虹渐变、两端圆头,深浅色主题都适配

同步稳定性

  • 修复乐观锁误报:运行中清空目标库/目标表时,行数审计清游标与同轮推进游标相撞,变更日志报 StaleObjectStateException 红色错误(不影响数据,但吓人且下轮多付一次全量)。现在审计清游标后沿用保存返回的实例继续;进度行万一被并发写过(如手工重置),推进游标时自动重读重试一次
  • 新增契约测试锁定游标交接行为;单元测试增至 419 个

内部清理(行为不变)

  • 移除 22 项 Java 死代码(无调用方法、只写字段、无调用派生查询)与 12 项前端死规则 / 死资源;单元测试增至 417 个

升级

换 jar、重启即可,配置无需改动,元数据库与已存加密口令不受影响。元数据库中的 captured_at、task_name 两列本版起不再使用,列会留着(废弃但无害),无需手工清理。

完整文档

README(中文) · README (English)

v1.3.0 — Jync 捷同 首发

Choose a tag to compare

@vfaner vfaner released this 24 Sep 00:42

Jync 捷同 —— 异构数据库实时同步结构与数据的开箱即用 Web 应用,单 jar 启动。官网 jync.qqmu.com。

v1.3.0

  • SyncTool 正式更名 Jync 捷同,产物更名 jync.jar(元数据库与浏览器偏好自动迁移)
  • 打包 27 项审查修复;覆盖更新追加立即同步补跑与列表分页,修复 MySQL 时间列精度回归
  • 默认端口 8080,JDK 17+,换 jar 重启即完成升级

完整更新内容见官网更新日志。

下载下方附件 jync.jar 即可使用。

v1.2.1

Choose a tag to compare

@vfaner vfaner released this 22 Sep 12:08

SyncTool v1.2.1

v1.2.0 之上的增量版本:五种信创数据库预置与驱动内置、Oracle 连接与信创类型转换的修复,以及一轮界面改进。

本次更新

五种信创数据库预置

  • 新增 OceanBase、TiDB、瀚高(HighGo)、Vastbase、崖山(YashanDB) 五种预置类型,驱动随包内置,不需要自备 jar
  • 这五种类型接入专属元数据读取器。此前它们走通用 JDBC 读取器,而通用读取器读不到视图定义和函数体,视图与函数同步会被静默跳过
  • 类型映射特判改按「方言族」判断:源库属 Oracle 族(Oracle、达梦、崖山)且目标库不同族时,DATE(带时间)加宽为 TIMESTAMP;未指定精度的 NUMBER 映射为浮点小数。此前这两条特判只认 Oracle 一种类型,达梦、崖山源库会静默丢失时间部分或小数部分

Oracle 连接修复

  • 连接串改用服务名写法,修复仅登记了服务名的实例报 ORA-12505 连不上的问题

界面改进

  • 系统信息页新增 「项目与作者」 栏目:GitHub / Gitee 仓库链接与 QQ、微信联系方式,配置留空时对应行自动隐藏
  • 导航栏登录人按钮改为下拉菜单:修改密码就地打开弹窗(不再跳转页面),退出登录直接提交;桌面端鼠标悬停即展开
  • 移除导航栏的 GitHub 图标按钮,仓库入口收敛到赞赏弹窗与系统信息页
  • 修改密码弹窗对齐设计稿:标题与标签居中、取消与确认修改右齐,文案调整为原密码、新密码长度至少 6 位、确认修改
  • 默认密码横幅的「立即修改」改为就地打开改密弹窗
  • 赞赏按钮的心形图标固定为红色,不再随文字色渲染成墨黑

升级

换 jar、重启即可,配置和数据不动;本次元数据库没有结构变更。

加密口令必须与之前一致,否则已存的数据库密码无法解密。停机期间源库产生的变更,重启后由游标机制自动补齐。

首次安装请先阅读 v1.2.0 发布说明 中的「首次启动必读」与「环境要求」。

完整文档

README(中文) · README (English) · 演示视频(B 站)

v1.2.0

Choose a tag to compare

@vfaner vfaner released this 13 Sep 04:17

SyncTool v1.2.0

异构数据库实时同步工具。开箱即用的可执行 jar,放到内网机器上 java -jar 就能跑,不需要源码、不需要 Maven。

这个版本整合了 v1.1.1、v1.1.2 以及此前未发布的改动,包含新功能和界面调整,因此版本号跳到 1.2.0。

本次更新

数据库连接区分「源」与「目标」

  • 连接列表拆为源数据库连接、目标数据库连接两个栏目,各自独立分页
  • 新建连接必须选择用途:源(数据读出)或目标(数据写入)
  • 新建项目时源、目标下拉只列出对应用途的连接,不会再选错
  • 升级后原有连接首次启动自动归类(按已有项目的引用关系推断,未被引用的默认为源),无需手工处理
  • 已被项目占用的连接不能反向改用途,页面会提示相关项目名称

常用数据库驱动内置

MySQL、MariaDB、Oracle、SQL Server、DB2、PostgreSQL、openGauss、达梦、人大金仓、H2 共十种驱动随包内置,不再需要手动往服务器放 jar。GBase、神通(Oscar)和自定义类型仍需填写厂商驱动 jar 路径。

其他改进

  • 新增「系统信息」页(原「设置」菜单改名):显示当前版本、GitHub 最新版本与本版更新说明;更新检查在后台进行,不拖慢页面,纯内网也能看当前版本和更新内容,也可用 --app.update-check.enabled=false 关闭
  • 变更日志页支持手动 / 自动刷新(5 秒一轮,不整页重载),第二页之后自动刷新自动停用以免阅读时行位跳动
  • 新建连接时默认端口随数据库类型自动联动
  • 修复删除正被项目占用的连接时错误提示显示为英文代码的问题

快速开始

java -jar synctool.jar

访问 http://localhost:8080,用下面的账号登录。

升级

换 jar、重启即可,配置和数据不动。本次会自动给元数据库加一列保存连接用途,启动日志出现 Backfilled source/target role... 即归类完成;升级后建议到连接页核对一眼,需要当目标用的连接在编辑页改用途即可。

加密口令必须与之前一致,否则已存的数据库密码无法解密。停机期间源库产生的变更,重启后由游标机制自动补齐。

从 v1.0.0 升级请先读 v1.1.0 发布说明(v1.1.0 起加入登录鉴权)。

首次启动必读

  1. 改掉初始密码:内置 admin / view 两个账号,初始密码都是 123456,登录后点右上角用户名修改;忘记密码无法找回,只能删除元数据库 app_user 表对应行后重启
  2. 覆盖加密口令:jar 内置公开默认密钥,首次保存连接前请通过 --sync.crypto-password 和 --sync.crypto-salt 设置自己的口令,否则存进去的数据库密码等于明文
  3. 固定数据目录:程序在启动目录下创建 ./data(元数据库,含加密凭据)、./logs、./snapshots,请固定在同一目录启动;元数据库文件按凭据对待,不要提交到版本库

环境要求

  • JDK 17 或以上
  • GBase、神通(Oscar)和自定义数据库需要自备厂商驱动 jar

完整文档

README(中文) · README (English) · 演示视频(B 站)

v1.1.0

Choose a tag to compare

@vfaner vfaner released this 07 Sep 22:20

SyncTool v1.1.0

异构数据库实时同步工具。开箱即用的可执行 jar,放到内网机器上 java -jar 就能跑,不需要源码、不需要 Maven。

本次更新:登录与权限

v1.0.0 完全没有鉴权 —— 任何能访问到端口的人都可以调接口改数据库连接和 AI 配置。建议所有 v1.0.0 用户升级。

  • 所有页面和接口都必须登录后才能访问,没有匿名入口
  • 两个内置角色:admin(管理员,全部操作)和 view(访客,只读)
  • 权限按 HTTP 方法判定:本工具所有写操作都是 POST,规则只有一条「POST 一律要求管理员」,新增 POST 接口不必改配置就自动受管。这条规则按方法生效,因而不覆盖 PUT / PATCH / DELETE —— 测试里有一条守卫盯着这件事,一旦有处理器映射到这些方法,构建就会失败
  • 访客能看到所有列表页和详情页的数据,但界面上不出现任何写操作按钮,直接构造请求打接口也会被拒;新增与编辑表单页本身也不对访客开放
  • 两个角色都能自助修改密码(当前密码 + 新密码至少 6 位)
  • 启用 CSRF 防护:第三方页面无法借你已登录的浏览器发起写请求
  • 登录密码用 BCrypt 单向哈希存储

快速开始

java -jar synctool.jar

访问 http://localhost:8080,用下面的账号登录。

⚠️ 首次启动必读

1. 立刻改掉初始密码

首次启动会在元数据库自动创建两个账号,初始密码都是 123456:

用户名 角色 权限
admin 管理员 全部操作
view 访客 只读

这个 jar 是公开可下载的,所以初始密码不是秘密。登录后点右上角用户名 → 修改密码。仍在用初始密码的账号,登录后每页顶部都会挂一条红色警告横幅,横幅只点名当前登录的这个账号。可以临时关掉,但浏览器一关又会回来,直到密码真的改了。

密码是 BCrypt 单向哈希,忘记无法找回。真忘了就删掉元数据库 app_user 表里对应那行,重启会重新种回初始密码。

2. 必须覆盖加密口令

jar 里内置了一个公开的默认加密密钥(synctool-default-key-change-me),它负责加密你存进去的每一个数据库密码和 AI API Key。用默认值等于没加密。

java -jar synctool.jar \
  --sync.crypto-password=你自己的强口令 \
  --sync.crypto-salt=你自己的16位十六进制盐

在第一次保存任何数据库连接之前就改好。 已经存进去的密码是用旧口令加密的,事后换口令会导致这些密码无法解密,只能重新录入。

3. 数据目录

首次启动会在当前工作目录下创建 ./data(H2 元数据库)、./logs、./snapshots。请固定在同一目录启动,或用绝对路径覆盖配置。

./data/synctool.mv.db 里存着你所有的数据库凭据和 AI API Key(加密的,但口令如果没改就等于明文)。不要提交到版本库,备份和拷贝时按凭据文件对待。

从 v1.0.0 升级

# 1. 停服并备份
sudo systemctl stop synctool
cp -r /opt/synctool/data /opt/synctool/data.bak

# 2. 换 jar
cp synctool.jar /opt/synctool/synctool.jar

# 3. 启动
sudo systemctl start synctool

元数据库用 ddl-auto: update,app_user 表会自动建好并种入上面两个账号。加密口令请保持和之前一致,否则已存的数据库密码无法解密。停机期间源库产生的变更会在重启后由游标机制自动补齐。

环境要求

  • JDK 17 或以上
  • 内置 MySQL 驱动;Oracle / SQL Server / DB2 等需要把驱动 jar 放到 ./drivers 目录(见 README「加载非内置驱动」)

完整文档

README(中文) · README (English)

v1.0.0

Choose a tag to compare

@vfaner vfaner released this 04 Sep 06:30

在异构数据库之间实时同步结构与数据的开箱即用 Web 应用。单个 jar 启动,浏览器点几下即可让 Oracle 的表持续流向 PostgreSQL、让 MySQL 的增量实时落到达梦 —— 不需要 Kafka、不需要 ZooKeeper、不需要写一行代码。

快速开始

下载下方的 synctool.jar,唯一前置条件是 JRE 17+(java -version 确认)。

java -jar synctool.jar \
  --sync.crypto-password='换成你自己的随机长串' \
  --sync.crypto-salt='换成你自己的16位hex'

浏览器打开 http://localhost:8080,先建源库与目标库连接(保存前点「测试连接」),再建项目、勾选对象、启动同步。

改端口加 --server.port=9090。启动目录下会生成 data/(H2 元数据库,存连接与项目配置)和 logs/,换目录启动会读不到之前的配置,建议固定一个工作目录。

⚠️ 上面那两个参数不是可选的

jar 里打包的是公开的默认加密密钥(synctool-default-key-change-me),它负责加密你存进工具的所有数据库密码。不覆盖的话,任何拿到同一个 jar 的人都能解开你的库密码 —— 而这个 jar 是公开下载的。

生产部署请写进启动脚本或环境变量(SYNC_CRYPTO_PASSWORD / SYNC_CRYPTO_SALT),不要留在命令行历史里。首次启动后再改这两个值,已存的密码将无法解密,需要重新录入。

支持的数据库

MySQL、MariaDB、Oracle、SQL Server、DB2、PostgreSQL、OpenGauss、达梦 (DM)、人大金仓 (KingBase)、南大通用 (GBase)、神通 (Oscar)、H2,以及自定义数据库(填 JDBC URL + 驱动类名 + 驱动 jar 路径,运行时动态加载)。

内置驱动只有 MySQL / PostgreSQL / H2。 其余数据库需要你自己准备驱动 jar 并在连接配置里填写路径 —— 发行包不捆绑商业驱动,也就不会因为驱动版本冲突污染应用类加载器。

本版本包含

  • 实时同步:轮询检测(默认 2 秒),也可用 Cron 表达式精确编排;表结构、表数据、索引、视图、存储过程与函数
  • 并发与一致性:增量窗口闭区间、游标在数据提交之后才推进、所有写入幂等、时间戳安全回退、单实例执行三层锁、停机期间的变更在重启后补齐
  • 方言适配:类型映射、函数名转换、标识符引号、分页语法、存储过程包装
  • AI 辅助存储过程转换(可选):机械转换走不通的复杂过程,可让模型起草候选,在审阅页人工确认后落库。AI 只产出候选,永不参与同步;未配置供应商时工具不产生任何外部请求,--sync.ai.enabled=false 可彻底移除该功能(含菜单与接口)
  • 内网离线可用:前端无 CDN、无 webfont,运行时零外部请求;中英文切换、明暗主题

已知限制

  • 复杂存储过程的过程化控制流无法可靠自动翻译,需在审阅页人工确认;语法检查通过不等于语义等价,关键过程务必在目标库实测
  • 行删除检测需比对双方主键全集,仅对行数低于 full-compare-max-rows(默认 20000)的表启用
  • 无主键表无法保证写入幂等,重放可能产生重复行(工具会告警)
  • 假定目标库仅由本工具写入
  • 轮询方案的延迟下限即轮询间隔

完整说明见 README · English