BoxLang 1.11.0 版本发布:性能优化与稳定性提升
目录
我们很荣幸地宣布 BoxLang 1.11.0 正式发布。这是一个专注于性能和稳定性的版本,无需修改任何代码,即可为所有 BoxLang 应用程序带来显著的速度提升。团队在字节码生成、类加载、锁管理和类型转换方面进行了深入优化,这是迄今为止最具影响力的运行时优化版本之一。除了性能提升外,此版本还解决了关键的并发错误,增强了 DateTime 处理能力,并提供了强大的开发者工具。
🚀 1.11.0 版本新特性
您可以在此处查看完整的发行说明: https://boxlang.ortusbooks.com/readme/release-history/1.11.0
⚡ 性能大提升 — 15+ 项针对性运行时优化
BoxLang 1.11.0 包含了 15 项以上的针对性性能改进,涵盖了字节码编译、运行时执行、内存管理和并发处理。所有 BoxLang 应用程序均可立即受益。
字节码与编译 编译器已进行了大幅优化:
- 优化字节码生成:在值操作期间避免不必要的类型转换。
- 编译时缓存
isFinal和isAbstract标志,而非在运行时进行计算。 - 重构 FQN 解析:消除了每次类查找时昂贵的正则表达式操作。
- 改进 ClassInfo 查找:在编译期间使用更优的缓存策略。
- 优化 ClassLocator 缓存键生成:通过改进
hashCode()创建方式。
运行时执行 核心运行时操作显著加快:
内存与并发
- 缓存函数上下文中的
variables作用域引用。 - 缓存 Web 请求配置,而非在每个请求中重新解析。
- 不区分大小写的字符串匹配使用优化算法。
- 减少
toRealPath()调用,避免了每次文件操作的静默开销。 - 简化 Box Class 的构造路径,降低对象创建开销。
- 移除函数内部类,减少类加载和 GC 压力。
- 避免在 UDF 调用中使用
Map.containsValue()(从线性扫描变为常数时间)。
🔒 并发与锁安全性 — 关键修复
独占锁系统中的两个关键错误已得到解决。在 1.11.0 之前,在高负载下,独占锁有时可能会允许超过一个线程进入所谓的“独占”区域(BL-2203, BL-2205)。
锁存储也得到了改进(BL-2201),以实现更好的性能和内存效率。
🗓️ DateTime 类型转换可靠性
对 DateTime 转换进行了全面检查,确保在所有常见格式和边界情况下都能稳健处理日期:
🆕 enforceUDFTypeChecks 配置项
一个新的运行时设置允许您跳过 UDF 参数和返回类型验证,这对于受信任的高性能代码库非常有用:
当设为 false 时,BoxLang 会跳过函数调用时的参数类型验证和返回类型转换,类似于 Java 编译器的泛型类型擦除。这可以提高性能,但会失去运行时类型检查的安全保障。
⏱️ getTickCount() — 纳秒与秒精度支持
getTickCount() 除了现有的毫秒支持外,现在还支持 nano(纳秒)和 second(秒)单位:
🗑️ 新增内置函数 (BIF): ExecutorDelete()
添加了缺失的 ExecutorDelete() 函数,完善了执行器生命周期管理 API。此前,关闭执行器并不会将其从执行器注册表中移除([BL-2168]),导致在重新创建同名执行器时出现问题。
🤖 核心运行时更新
🏗️ 类系统改进
- 父类加载机制改进:更可靠地处理复杂的继承层次结构。
- 抽象类强制执行规则放宽:抽象类不再强制要求实现所有接口方法(符合 Java 和 CFML 语义)。
- 类型化数组返回:当类通过不同的调用路径实例化时,不再抛出 NPE。
- 隐式访问器:在方法签名中生成正确的返回类型,不再默认使用
any。
🧵 线程与执行修复
- 修复了边缘情况下的重复字节码方法生成问题。
- 解决了未分配
new Foo()时的堆栈高度不兼容问题。 - 修复了类文件中的非法异常表范围问题。
- 修复了 LSP 在获取缓存大小时的解析器并发问题。
📊 查询系统
QueryNew()和queryAddRow()现在可以正确验证列类型。distinct(col)在 QoQ 中不再被误认为是函数名。- 包含 ODBC 时间戳格式列的 QoQ 现在可以正确编译。
- 修复了循环中查询列作用域赋值的边缘问题。
🔤 字符串与类型改进
quotedValueList()现在根据 CFML 规范正确地用单引号包裹值。println()现在可以不带参数调用以输出空行。compareTo()日期成员方法不再错误地附加到零值的 BigDecimal 上。
🌐 XML 处理
- 从
XMLAttribute删除不存在的键不再抛出错误。 XMLChildren在所有变异情况下都能正确更新。- WDDX 现在可以正确转义属性值中的特殊字符。
🔐 事务与存储过程
- 当在事务内执行存储过程时,事务
end操作不再抛出错误。 - 事务
action属性现在不区分大小写。
📡 MiniServer 运行时更新
📁 .boxlang.json 约定
MiniServer 现在会自动检测并加载当前工作目录中的 .boxlang.json 文件,并将其与基础 BoxLang 配置合并。这使得项目级的配置具有可移植性且自包含,非常适合容器化部署和团队开发环境。
⚙️ Undertow / Socket / WebSocket 选项
现在可以直接在 miniserver.json 中调整 Undertow、套接字和 WebSocket 的底层选项。
📂 日志目录输出
MiniServer 现在会在启动期间记录日志目录的路径。
🔄 Undertow 升级至 2.3.23.Final
MiniServer 现在运行在 Undertow 2.3.23.Final 上,带来了最新的 HTTP 服务器修复和安全补丁。
🌐 Web 支持更新
🔀 用于请求重路由的预请求拦截
新增了一个拦截点,会在 onRequestStart 之前触发,使得拦截器能够在应用程序生命周期开始前重路由请求。这解锁了多种强大的请求网关模式:
- A/B 测试路由和功能开关
- 维护模式绕过
- 多租户请求路由
- 身份验证重定向## 🛠️ 开发体验
🌳 增强的 --bx-printast 工具
--bx-printast CLI 标志现在支持文件路径和标准输入管道 (BL-2187),这使得它在调试解析器输出和集成构建工具时更加实用:
🧩 SOAP 客户端 --- 支持二进制和 Map 类型
SOAP 客户端现在支持请求和响应中的二进制数据以及 Map/Struct 类型。此外,它还允许你直接调用服务方法,无需通过 invoke():
🔧 boxlang.json 中的会话配置
现在支持两个之前缺失的会话配置设置 (BL-1859):
📋 改进的 CLI 错误消息
当 BoxLang 脚本失败时,CLI 错误消息现在可以提供更清晰的上下文和可操作的信息 (BL-2212)。
🐛 重要 Bug 修复
🔧 配置更新摘要
📦 依赖更新
- Undertow 升级至
2.3.23.Final - Gradle wrapper 更新至
9.3.1 - Jackson Jr 升级至
2.21.1 - Logback Classic 升级至
1.5.32
🎯 升级指南
BoxLang 1.11.0 是一个直接替换的升级版本。无需更改任何代码即可从性能改进中受益。
完整的发行说明、文档和下载地址请访问 boxlang.io 和 boxlang.ortusbooks.com。
加入 BoxLang 社区 ⚡️
成为塑造 Web 开发未来的一员。保持联系并获取关于 Into the Box 2025、产品发布、工具更新等的最新消息。
订阅我们的时事通讯以获取独家内容。
关注我们的社交媒体,不错过任何新闻和更新:
- https://x.com/ortussolutions
- https://www.facebook.com/OrtusSolutions
- https://www.linkedin.com/company/ortus-solutions-corp
- https://www.youtube.com/OrtusSolutions
- https://github.com/Ortus-Solutions
与 BoxLang 和 CFML 传奇人物一起参加 Into the Box 2025。让我们一起学习、分享和编码,共创一个现代、尖端的 Web 开发未来。