MySQL 中引入对 JavaScript 的支持

MySQL 不断进行创新,现在数据库中包含了丰富的程序编程功能。开发人员现在可以在 MySQL 数据库服务器中编写 JavaScript 存储程序(函数和过程)。这些存储程序将通过 GraalVM 运行时间运行。该功能在 MySQL 企业版中作为预览版提供,可通过 Oracle Technology Network (OTN) 下载。 MySQL-JavaScript 还可在 OCI、AWS 和 Azure 上的 MySQL Heatwave 云服务中使用。

为什么要使用 JavaScript 存储程序?

JavaScript 是最受开发人员欢迎的编程语言。 除了更简单的语法和对现代语言功能的支持外,其受欢迎的一个关键因素是丰富的生态系统提供了大量可重复使用的代码模块。

当需要持久存储时,最流行的开源数据库 MySQL 将是 JavaScript 开发人员的自然选择。通过在存储程序中支持 JavaScript,开发人员将能够使用熟悉的语言编写 MySQL 存储程序,并利用广泛的 JavaScript 生态系统!

对 JavaScript 存储程序的支持,不仅可以利用庞大的生态系统提高开发人员的工作效率,还能让更多开发人员掌握编写存储程序的必要技能。 换句话说,企业现在可以利用广泛可用的 JavaScript 技能集进行后端开发,从而发掘更多的开发人才。

存储程序最大限度地减少了数据库服务器和应用程序之间的数据移动,因而具有重要优势。传输大量数据,尤其是批处理数据,可能会因多种原因而产生问题:

  • 它不仅耗时,而且会造成巨大的网络开销。
  • 当应用程序 “闲聊 “时,延迟可能会明显增加。
  • 在中层或应用层处理大量数据需要大量内存和存储空间,增加了成本。
  • 由于安全风险和数据保护要求,通常必须避免机器之间的数据传输,尤其是在云环境中。
  • 在数据库服务之外移动大量数据会增加出口成本。

使用存储程序在数据库内处理数据是解决这些问题的常用方法。

新的使用场景

MySQL-JavaScript 为应用程序设计带来了新的机遇,而这些机遇曾一度受限于权衡利弊。JavaScript 存储程序使开发人员能够避开数据移动,在数据库内轻松无缝地实现高级数据处理逻辑。下面列出了一些简单的用例:

  • 数据提取:从数据库中常用的复杂对象(如 URL 字符串)中提取信息。
  • 数据格式化:使用广泛使用的模板化方案(如 JavaScript Mustache 软件包)生成格式化字符串。
  • 近似搜索:在 SELECT 查询中使用相似性评分函数,例如从表中检索相似字符串。
  • 数据验证:使用复杂的验证规则清理数据。例如,使用 JavaScript Validator 软件包。
  • 压缩/编码:使用不包含在 MySQL 中的自定义算法进行数据压缩和加密。
  • 数据转换:更改数据表示,例如将字符串列转换为特征工程中使用的稀疏矩阵表示。

所提供的示例只是该功能潜力的一个缩影。还有更多复杂的用例,如部署完整的数据管道和为机器学习应用建立暂存环境。

MySQL-JavaScript

MySQL 正在引入对 JavaScript 存储程序的支持。用户现在可以在数据库中表达丰富的程序逻辑。JavaScript 运行时通过 GraalVM 集成,用户可以免费使用 GraalVM 的所有企业版 (EE) 功能,如编译器优化、性能和安全功能。

该版本支持

  • 基于 ECMAScript 2021 的 JavaScript 语言
  • 存储过程和存储函数
  • MySQL 数据类型,如整数、浮点数和 CHAR/VARCHAR 类型的所有变化

ECMAScript 标准库包括许多基本的使用操作和数据结构,使实现变得简单而富有表现力。开发人员还可以从在线软件包管理器(如 “npm”)中重用数百万个可用的第三方软件包。

什么是 GraalVM?

GraalVM 是一个 Oracle 编译器生态系统,包括 JDK 以及 JavaScript、R、Python、Ruby 和 Java 等语言实现。它包括即时(JIT)和超前(AOT)编译技术。 它还提供了一个完全托管的虚拟机,具有沙箱功能和工具支持。MySQL-JavaScript 与 GraalVM 企业版集成。

定义 JavaScript 存储程序

要在 MySQL 中创建 JavaScript 存储程序,可以使用与传统存储函数和存储过程相同的 SQL 语句:

CREATE FUNCTION gcd_js (a INT, b INT) RETURNS INT 
LANGUAGE JAVASCRIPT AS $$

  let [x, y] = [Math.abs(a), Math.abs(b)];
  while(y) [x, y] = [y, x % y];
  return x;

$$;

从上面的示例可以看出,JavaScript 代码是直接嵌入到 SQL 可调用函数的定义中的。 参数的名称可以在 JavaScript 代码中直接引用,当函数被调用时,SQL 类型和 JavaScript 类型之间将进行隐式类型转换。要调用 JavaScript 存储过程,应使用 CALL 语句,这与常规的 SQL 存储过程类似。 存储过程支持输入和输出参数。

在 SQL 语句中执行 JavaScript 代码

可以在任何可以调用传统 SQL 函数的 SQL 语句中调用 JavaScript 函数,如 SELECT 表达式、WHERE、GROUP BY 和 ORDER BY 子句、DML、DDL、视图等。下面是一个调用我们在上面定义的函数的 SQL 语句示例:

SELECT col1, col2, gcd_js(col1,col2)
FROM my_table
WHERE gcd_js(col1, col2) > 1
ORDER BY gcd_js(col1, col2);

CREATE TABLE gcd_table 
AS SELECT gcd_js(col1,col2)
FROM my_table;

调试 MySQL 中的 JavaScript 代码

调试与软件开发同步进行。当 JavaScript 程序在数据库中运行时,MySQL-JavaScript 功能会提供额外的 SQL 接口,以帮助排除故障。

CREATE PROCEDURE division (IN a INT, IN b INT,
OUT result DOUBLE) LANGUAGE JAVASCRIPT AS $$
  function validate(num) {
    console.log("validating input value: ", num);
    if (num === 0) throw ("Division by Zero!");
  }
  validate(b);
  result = a / b;
$$

JavaScript 异常与 MySQL 错误之间的转换是透明的。除标准输出外,开发人员还可以访问 JavaScript 堆栈跟踪。

CALL division( 5, 0, @res);
ERROR 6000 (HY000): JavaScript> Division by Zero!

SELECT mle_session_state("stdout");
validating input value:  0

SELECT mle_session_state("stack_trace");
<js> validate(division:9:187-214)
<js> division(division:11:222-232)
<js> :anonymous(division:15:256-265)
</js></js></js>

安全性

MySQL 中的 JavaScript 支持可提供最高级别的安全性、隔离性和数据保护。 MySQL 的 JavaScript 依赖于业界公认的 Oracle GraalVM 安全保证。

虚拟机沙盒可确保恶意代码无法入侵 MySQL 服务器的其他模块。每个存储程序都在自己的上下文中解析和执行。这种隔离策略不允许一个存储程序读取或修改其他存储程序的数据或代码。JavaScript 用户代码生成或操作线程受到限制,而且 JavaScript 用户代码无法访问网络通信或文件系统。

JavaScript 存储程序基于标准的 MySQL 权限模型。只有有权限的用户才能创建存储程序。对 SP 的访问也可以通过权限来控制。一个用户可以定义其他用户可以执行的存储程序。

兼容性

JavaScript 存储程序可与传统的 SQL 存储程序无缝兼容。该功能与存储引擎无关,可从 InnoDB、Lakehouse 和 HeatWave 透明地访问数据。

MySQL Heatwave 服务现在已在 OCI、AWS 和 Azure 服务部署中预装并配置了 JavaScript。对于 MySQL 企业版,该功能需要手动安装和配置。

性能

MySQL-JavaScript 集成针对其特定用例使用定制的虚拟机,以实现最佳的端到端性能。这种定制基于 GraalVM 的超前(AOT)编译,将语言实现编译成本地二进制表示法,以便快速处理。

GraalVM 拥有自己基于 ECMAScript 2021 标准的 JavaScript 实现。该语言实现在性能方面很有竞争力,尽管它是使用 GraalVM 的 Polyglot 框架实现的,该框架侧重于在同一虚拟机中支持多种编程语言。

最后,MySQL-JavaScript 功能还得益于 GraalVM 企业版的各种先进优化技术,如编译器优化,包括积极的内联和部分转义分析。这还包括一个配置文件引导的即时(JIT)编译器,可在运行时在解释器和本地编译之间切换。

结论

MySQL-JavaScript 使开发人员能够直接在 MySQL 服务器中表达复杂的编程逻辑。这样,开发人员就能将应用程序中的数据密集型部分推近数据,从而降低数据移动成本。使用基于 ECMAScript 2021 的 JavaScript 可以防止供应商锁定问题,同时开发人员还可以享受 GraalVM(企业版)的所有优势,而无需支付额外费用。要免费试用 MySQL-JavaScript,请从 Oracle Technology Network (OTN) 下载 MySQL 企业版。MySQL-JavaScript还与MySQL HeatWave云服务无缝集成,开发人员可通过指尖获得最新的创新技术。

想了解更多信息?

详情请参阅《用户手册》(JavaScript 存储程序第 25.3 节

演示

余下全文(1/3)
分享这篇文章:

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注