Ohhnews

分类导航

$ cd ..
foojay原文

BoxLang 1.11.0 版本发布:性能优化与稳定性提升

#boxlang#编程语言#软件开发#性能优化#后端技术

目录


我们很荣幸地宣布 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 应用程序均可立即受益。

字节码与编译 编译器已进行了大幅优化:

  • 优化字节码生成:在值操作期间避免不必要的类型转换。
  • 编译时缓存 isFinalisAbstract 标志,而非在运行时进行计算。
  • 重构 FQN 解析:消除了每次类查找时昂贵的正则表达式操作。
  • 改进 ClassInfo 查找:在编译期间使用更优的缓存策略。
  • 优化 ClassLocator 缓存键生成:通过改进 hashCode() 创建方式。

运行时执行 核心运行时操作显著加快:

// 在 1.11.0 中这些操作都更快了 — 无需修改代码
result = myClass.doWork()           // 通过 this.get() 加快类构造
found  = myArray.find( "value" )    // 优化 arrayFind,避免流开销
flag   = isBoolean( "true" )        // 更快的布尔字符串解析
someBif( arg1, arg2 )               // 通过键而非反射进行参数/返回值类型转换

内存与并发

  • 缓存函数上下文中的 variables 作用域引用
  • 缓存 Web 请求配置,而非在每个请求中重新解析。
  • 不区分大小写的字符串匹配使用优化算法。
  • 减少 toRealPath() 调用,避免了每次文件操作的静默开销。
  • 简化 Box Class 的构造路径,降低对象创建开销。
  • 移除函数内部类,减少类加载和 GC 压力。
  • 避免在 UDF 调用中使用 Map.containsValue()(从线性扫描变为常数时间)。

🔒 并发与锁安全性 — 关键修复

独占锁系统中的两个关键错误已得到解决。在 1.11.0 之前,在高负载下,独占锁有时可能会允许超过一个线程进入所谓的“独占”区域(BL-2203, BL-2205)。

// 此临界区在并发负载下现在真正实现了独占
lock name="processPayment_#orderId#" type="exclusive" timeout="30" {
    // 1.11.0 保证同一时间只有一个线程会在此处
    if ( !paymentProcessed( orderId ) ) {
        processPayment( orderId )
    }
}

锁存储也得到了改进(BL-2201),以实现更好的性能和内存效率。

🗓️ DateTime 类型转换可靠性

对 DateTime 转换进行了全面检查,确保在所有常见格式和边界情况下都能稳健处理日期:

// 在 1.11.0 中这些现在都能可靠运行
date1 = createDateTime( "01-31-2026 23:59:  59" )          // BL-2189
date2 = createDateTime( "9-30-2010" )                     // BL-2222
date3 = parseDateTime( "2026-01-31 00:00: 00.000" )        // ODBC 时间戳 (BL-2143)

// 包含 ODBC 时间戳列的 Query of Queries 现在可以正确编译
qoq = queryExecute(
    "SELECT * FROM myQuery WHERE dateCol > :dt",
    { dt : now() },
    { dbtype : "query" }
)  // BL-2144

// DateTimeCaster 现在处理 ODBC 日期/时间格式
cast1 = dateTimeFormat( odbcDate, "yyyy-mm-dd" )          // BL-2188

🆕 enforceUDFTypeChecks 配置项

一个新的运行时设置允许您跳过 UDF 参数和返回类型验证,这对于受信任的高性能代码库非常有用:

// boxlang.json
{
    "enforceUDFTypeChecks": false
}

当设为 false 时,BoxLang 会跳过函数调用时的参数类型验证和返回类型转换,类似于 Java 编译器的泛型类型擦除。这可以提高性能,但会失去运行时类型检查的安全保障。

⏱️ getTickCount() — 纳秒与秒精度支持

getTickCount() 除了现有的毫秒支持外,现在还支持 nano(纳秒)和 second(秒)单位:

// 纳秒精度的微基准测试
start   = getTickCount( "nano" )
doExpensiveWork()
elapsed = getTickCount( "nano" ) - start
println( "Elapsed: #elapsed# ns" )

// 秒级别的粗略计时
start   = getTickCount( "second" )
sleep( 2000 )
elapsed = getTickCount( "second" ) - start
println( "Elapsed: #elapsed# seconds" )  // 2

🗑️ 新增内置函数 (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 现在会在启动期间记录日志目录的路径。

[BoxLang] MiniServer 正在启动...
[BoxLang] 日志目录: /home/app/.boxlang/logs
[BoxLang] 服务器启动于 http://localhost:8080

🔄 Undertow 升级至 2.3.23.Final

MiniServer 现在运行在 Undertow 2.3.23.Final 上,带来了最新的 HTTP 服务器修复和安全补丁。

🌐 Web 支持更新

🔀 用于请求重路由的预请求拦截

新增了一个拦截点,会在 onRequestStart 之前触发,使得拦截器能够在应用程序生命周期开始前重路由请求。这解锁了多种强大的请求网关模式:

  • A/B 测试路由和功能开关
  • 维护模式绕过
  • 多租户请求路由
  • 身份验证重定向## 🛠️ 开发体验

🌳 增强的 --bx-printast 工具

--bx-printast CLI 标志现在支持文件路径和标准输入管道 (BL-2187),这使得它在调试解析器输出和集成构建工具时更加实用:

$ bash
# 打印特定文件的抽象语法树 (AST)
boxlang --bx-printast /path/to/MyClass.bx

# 直接通过管道输入源代码
echo 'result = 1 + 2' | boxlang --bx-printast

# 与编辑器和构建流水线集成
cat MyComponent.bx | boxlang --bx-printast | jq '.body[0]'

🧩 SOAP 客户端 --- 支持二进制和 Map 类型

SOAP 客户端现在支持请求和响应中的二进制数据以及 Map/Struct 类型。此外,它还允许你直接调用服务方法,无需通过 invoke()

$ node
ws = soap( "http://example.com/DataService?wsdl" )

// 发送二进制数据
result = ws.uploadDocument( {
    name : "report.pdf",
    data : fileReadBinary( "/reports/annual.pdf" )  // 现已支持二进制
} )

// 发送 Map/Struct 数据
result = ws.updateRecord( {
    id       : 123,
    metadata : { region : "US", tier : "premium" }  // 现已支持 Map/Struct
} )

🔧 boxlang.json 中的会话配置

现在支持两个之前缺失的会话配置设置 (BL-1859):

$ cat
{
    "sessionManagement": true,
    "sessionCluster": false
}

📋 改进的 CLI 错误消息

当 BoxLang 脚本失败时,CLI 错误消息现在可以提供更清晰的上下文和可操作的信息 (BL-2212)。

🐛 重要 Bug 修复

工单编号摘要
BL-2203排他锁有时允许多个线程进入锁定区域
BL-2205高并发下的 cflock 竞态条件
BL-2189无法将 01-31-2026 23:59:59 转换为 DateTime
BL-2143DateTime 默认 ODBC 时间戳格式引号错误
BL-2157在事务中执行存储过程时事务结束抛出错误
BL-2165getCurrentTemplatePath() 在 catch 块中无法工作
BL-2196由于 *_FILE 的贪婪匹配,Docker 镜像中的 ENV 密钥展开存在问题
BL-2206存在额外井号 (#) 时的解析器错误
BL-2217模块公共远程类请求未触发应用程序生命周期事件
BL-2236赋值期间 form、url 和 CGI 作用域的作用域搜索错误
BL-2242switch 语句中的 Null 抛出错误
BL-2251抽象类被错误地要求实现所有接口方法

🔧 配置更新摘要

设置描述
enforceUDFTypeChecksruntime 中的新布尔值,用于禁用 UDF 参数/返回类型验证
sessionManagementboxlang.json 中全局启用/禁用会话管理
sessionClusterboxlang.json 中启用分布式会话集群
.boxlang.jsonMiniServer 现在会自动从工作目录加载此文件

📦 依赖更新

  • Undertow 升级至 2.3.23.Final
  • Gradle wrapper 更新至 9.3.1
  • Jackson Jr 升级至 2.21.1
  • Logback Classic 升级至 1.5.32

🎯 升级指南

BoxLang 1.11.0 是一个直接替换的升级版本。无需更改任何代码即可从性能改进中受益。

$ bash
# CommandBox
box install boxlang@1.11.0

# BVM
bvm install 1.11.0 && bvm use 1.11.0

# Docker
FROM ortussolutions/boxlang:1.11.0

完整的发行说明、文档和下载地址请访问 boxlang.ioboxlang.ortusbooks.com

加入 BoxLang 社区 ⚡️

成为塑造 Web 开发未来的一员。保持联系并获取关于 Into the Box 2025、产品发布、工具更新等的最新消息。

订阅我们的时事通讯以获取独家内容。

关注我们的社交媒体,不错过任何新闻和更新:

BoxLang 和 CFML 传奇人物一起参加 Into the Box 2025。让我们一起学习、分享和编码,共创一个现代、尖端的 Web 开发未来