githubEdit

1.5.0

August 30, 2025

We're excited to announce BoxLang 1.5.0, bringing significant improvements to performance, reliability, and developer experience. This release focuses on enhanced AWS Lambda support, better Java interoperability, improved query handling, and numerous bug fixes that make BoxLang more robust for production workloads.

🚀 Major Highlights

AWS Lambda Runtime Enhancements

BoxLang 1.5.0 introduces powerful optimizations for serverless deployments, including class caching, connection pooling, and performance metrics.

Enhanced Query Operations

Improved support for multiple SQL statements, better parameter handling, and enhanced metadata capture for database operations.

Advanced Java Interop

Better method resolution for overloaded Java methods and improved handling of primitive type expectations.


🏗️ AWS Lambda Runtime Features

Lambda Class Caching

Ticket: BL-1712arrow-up-right

BoxLang now caches compiled lambda classes to avoid expensive recompilations on subsequent invocations, dramatically improving cold start performance.

Configurable Connection Pooling

Ticket: BL-1716arrow-up-right

Control AWS runtime connection pool size via the new environment variable:

Performance Metrics Logging

Ticket: BL-1713arrow-up-right

Enable detailed performance metrics in debug mode to monitor Lambda execution times and resource usage.

Convention-Based URI Routing

Ticket: BL-1714arrow-up-right

Automatic routing using PascalCase conventions. You can now build multi-class Lambda functions with BoxLang easily following our conventions.


🔧 Core Runtime Improvements

Enhanced File Upload Support

Tickets: BL-1664arrow-up-right, BL-1663arrow-up-right

FileUpload now includes blockedExtensions argument and correctly populates file name properties:

Improved Error Handling for Primitive Returns

Ticket: BL-1680arrow-up-right

Better error messages when proxied UDFs return null where primitives are expected:

Memory Leak Prevention

Ticket: BL-1697arrow-up-right

Enhanced thread management prevents memory leaks with unbounded thread usage in long-running applications.

Virtual Thread Support for Parallel Operations

Ticket: BL-1687arrow-up-right

All parallel BIFs now support a virtual argument to leverage Java's virtual threads for improved performance and resource efficiency. You can also pass it instead of the maxThreads argument as well.

Performance Benefits:

  • Reduced Memory Footprint: Virtual threads use significantly less memory than platform threads

  • Better Scalability: Handle thousands of concurrent operations without thread pool exhaustion

  • Improved Throughput: Especially beneficial for I/O-bound operations like API calls or database queries

Supported Methods:

Type
Methods

Array

arrayEach(), arrayEvery(), arrayFilter(), arrayMap(), arrayNone(), arraySome()

List

listEach(), listEvery(), listFilter(), listMap(), listNone(), listSome()

Query

queryEach(), queryEvery(), queryFilter(), queryMap(), queryNone(), querySome()

Struct

structEach(), structEvery(), structFilter(), structMap(), structNone(), structSome()


📊 Database & Query Enhancements

Multiple SQL Statement Support

Ticket: BL-1186arrow-up-right

QueryExecute now properly handles multiple SQL statements:

Enhanced Generated Key Capture

Ticket: BL-1700arrow-up-right

Update Count Tracking

Ticket: BL-1701arrow-up-right

Improved Parameter Handling

Ticket: BL-1661arrow-up-right

Better handling of queries with both loose colons and positional parameters:


🔗 Java Interoperability Improvements

Better Method Resolution

Ticket: BL-1715arrow-up-right

Improved matching for overloaded Java methods:

Ticket: BL-1667arrow-up-right

Better preference handling when Java methods accept Object arguments:


🏗️ CFML Compatibility Enhancements

Script Custom Tag Support

Ticket: BL-1679arrow-up-right

Added support for Adobe ColdFusion script-based custom tags:

Encrypted Datasource Password Support

Ticket: BL-1127arrow-up-right

Support for Lucee-style encrypted datasource passwords:

Component Name Annotation Fix

Ticket: BL-1684arrow-up-right

The name annotation on components now correctly sets metadata without overwriting:


🛠️ Developer Experience Improvements

Enhanced List Functions

Ticket: BL-1660arrow-up-right

List BIFs now preserve custom delimiters when reassembling:

Tickets: BL-1669arrow-up-right, BL-1670arrow-up-right

Duration objects can now be compared with integers and other numeric values:

Class Metadata Enhancement

Ticket: BL-1686arrow-up-right

Box Class metadata now includes "output" key for better introspection:


🐛 Notable Bug Fixes

Query of Queries Parsing

Ticket: BL-1678arrow-up-right Fixed parsing errors in Query of Queries when using parentheses in expressions.

Super Reference Resolution

Ticket: BL-1674arrow-up-right Corrected super reference resolution for mixin UDFs in parent classes.

HTTP Header Handling

Ticket: BL-1676arrow-up-right Resolved HTTP errors when Accept-Encoding and TE headers are set as HTTP parameters.

Module Management

Ticket: BL-1705arrow-up-right Fixed module unload process to properly remove and unregister module resources.

Thread Context Handling

Ticket: BL-1696arrow-up-right Ensured threads consistently use the correct context classloader.

SQL Formatting

Ticket: BL-1683arrow-up-right Fixed the sqlPrettify function for proper SQL formatting.


📊 Performance & Reliability

  • Memory Usage: Reduced memory footprint through better thread management

  • AWS Cold Starts: Significant improvement through lambda class caching

  • Database Operations: Enhanced reliability with better error handling and connection management

  • Java Interop: More efficient method resolution and argument handling


🔧 Configuration Updates

Docker Environment Variables

Ticket: BL-1673arrow-up-right

Resolved collision between Docker env var BOXLANG_MODULES and the config modules key.

Cache Settings

Ticket: BL-1709arrow-up-right

Cache settings now properly replaced by environment variables:


⚡ Migration Notes

Breaking Changes

  • None in this release

Deprecations

  • No new deprecations

  1. AWS Users: Set BOXLANG_LAMBDA_CONNECTION_POOL_SIZE environment variable for optimal performance

  2. File Upload: Review code using fileUpload() to take advantage of new blockedExtensions security feature

  3. Module Developers: Test module loading/unloading if you experienced issues in 1.4.x


Release Notes

Improvements

BL-1556arrow-up-right Bump org.semver4j:semver4j from 5.8.0 to 6.0.0.

BL-1664arrow-up-right fileUpload missing blockedExtensions argument

BL-1680arrow-up-right Better error if proxied UDF returns null where primitive is expected

BL-1686arrow-up-right add "output" key to Box Class Meta

BL-1687arrow-up-right Add `Virtual` Argument to BIF supporting parallel operations

BL-1688arrow-up-right DynamicObject not unwrapping arguments passed to method

BL-1693arrow-up-right Remove query column map from query metadata

BL-1697arrow-up-right Prevent memory leak with unbounded thread usage

BL-1700arrow-up-right Capture all generated keys

BL-1701arrow-up-right Capture update counts

BL-1712arrow-up-right AWS Runtime - Cache compiled lambda classes to avoid recompilations

BL-1716arrow-up-right AWS Runtime - Add aws runtime pool configuration via new ENV variable: BOXLANG_LAMBDA_CONNECTION_POOL_SIZE which defaults to 2

Bugs

BL-1186arrow-up-right queryExecute multiple statements

BL-1660arrow-up-right List BIFs which reassemble the list don't preserve delimiters

BL-1661arrow-up-right queryExecute - cannot execute query containing loose ':' and positional parameters

BL-1663arrow-up-right fileUpload: serverFileName, serverFile, clientFile, clientFileName are not correct per the spec

BL-1667arrow-up-right Interop service when dealing with methods with `Object` arguments, would give preference to coercionable arguments. Ex: Formatter.format( BoxLang DateTime ) would fail

BL-1668arrow-up-right Trying to load module class before module is registered errors

BL-1669arrow-up-right duration can't compare against an integer

BL-1670arrow-up-right Compare operator cannot cast Duration to Number

BL-1671arrow-up-right JDBC - "driver not registered" log on engine startup despite being installed

BL-1673arrow-up-right Miniserver: Docker env var BOXLANG_MODULES collides with modules key in config

BL-1674arrow-up-right super reference incorrect for mixin UDF in parent class

BL-1675arrow-up-right string caster not obeying fail flag when inputStream errors

BL-1676arrow-up-right HTTP Error When Accept-Encoding and TE Headers are being set as HTTP Params

BL-1678arrow-up-right Parsing error in QoQ with parentheses

BL-1679arrow-up-right Missing support for ACF script custom tags

BL-1681arrow-up-right Ignore extraneous return values from void proxies

BL-1682arrow-up-right Usage of quoted operators fails to compile.

BL-1683arrow-up-right sqlPrettify is broken

BL-1684arrow-up-right CFML Compat - `name` annotation on Component overwrites the metadata name

BL-1696arrow-up-right Threads not always using context classloader

BL-1699arrow-up-right JDBC not handling raised errors

BL-1705arrow-up-right Module unload fails to remove/unregister module resources

BL-1706arrow-up-right Issues with numberFormat masks

BL-1709arrow-up-right Cache settings do not get replaced by environment variables

BL-1715arrow-up-right Java interop matching in correct overloaded methods

New Features

BL-1127arrow-up-right Add support for Lucee's encrypted datasource passwords in compat

BL-1713arrow-up-right AWS Runtime - Log performance metrics when in debug mode

BL-1714arrow-up-right AWS Runtime - URI Routing by convention using PascalCase: /products -> Products.bx, /home-savings -> HomeSavings.bx

Last updated

Was this helpful?