前端视角:MySQL 正式引入对 JavaScript 的支持将带来哪些利好?
今天是坚持日更的第158天,如果本文对您有帮助,记得点击关注、点赞、在看支持我
甲骨文公司宣布在 MySQL 中将引入对 JavaScript 的支持,这一消息在前端、后端技术圈引起了广泛关注。本文首先阐述MySQL 中将引入对 JavaScript 的支持的背景及应用实践,最后从前端视角来分析这一变化会给前端开发人员带来哪些利好。
1.MySQL-JavaScript 背景介绍
MySQL 不断进行创新,现在数据库中包含了丰富的程序编程功能。开发人员现在可以在 MySQL 数据库服务器中编写 JavaScript 存储程序(函数和过程)。这些存储程序将通过 GraalVM 运行时间运行。该功能在 MySQL 企业版中作为预览版提供,可通过 Oracle Technology Network (OTN) 下载。MySQL-JavaScript 还可在 OCI、AWS 和 Azure 上的 MySQL Heatwave 云服务中使用。
1.1.为什么要使用 JavaScript 存储程序?
JavaScript 是最受开发人员欢迎的编程语言。除了更简单的语法和对现代语言功能的支持外,其受欢迎的一个关键因素是丰富的生态系统提供了大量可重复使用的代码模块。
当需要持久存储时,最流行的开源数据库 MySQL 将是 JavaScript 开发人员的自然选择。通过在存储程序中支持 JavaScript,开发人员将能用熟悉的语言编写 MySQL 存储程序,并利用广泛的 JavaScript 生态系统!
对 JavaScript 存储程序的支持,不仅可以利用庞大的生态系统提高开发人员的工作效率,还能让更多开发人员掌握编写存储程序的必要技能。换句话说,企业现在可以利用广泛可用的 JavaScript 技能集进行后端开发,从而发掘更多的开发人才。
存储程序的一个关键优势是最大限度地减少了数据库服务器和应用程序之间的数据移动。出于多种原因,传输大量数据(尤其是批处理数据)可能会造成很多问题:
这不仅耗费时间,还会造成巨大的网络开销。 当应用程序进行频繁交互时,延迟会明显增加。 在中间层或应用层处理大量数据需要大量内存和存储空间,从而增加了成本。 由于安全风险和数据保护要求,通常必须避免机器之间的数据传输,尤其是在云环境中。 在数据库服务之外移动大量数据会增加出口成本。
使用存储程序在数据库内处理数据是解决这些问题的常用方法。
1.2.有哪些新的使用场景?
MySQL-JavaScript 为应用程序设计带来了新的机遇,而这些机遇曾一度受限于权衡利弊。JavaScript 存储程序使开发人员能够避开数据移动,在数据库内轻松无缝地实现高级数据处理逻辑。下面列出了一些简单的用例:
数据提取:从数据库中常用的复杂对象(如 URL 字符串)中提取信息。 数据格式化:使用广泛使用的模板化方案(如 JavaScript 的 Mustache 包)生成格式化字符串。 近似搜索:在 SELECT
查询中使用相似性评分函数,例如从表中检索相似字符串。数据验证:使用复杂的验证规则清理数据。例如,使用 JavaScript Validator 软件包。 压缩/编码:使用不包含在 MySQL 中的自定义算法进行数据压缩和加密。 数据转换:更改数据表示,例如将字符串列转换为特征工程中使用的稀疏矩阵表示。
所提供的示例只是该功能潜力的一个缩影。还有更多复杂的用例,如部署完整的数据管道和为机器学习应用建立暂存环境。
1.3.MySQL-JavaScript
MySQL 正在引入对 JavaScript 存储程序的支持。用户现在可以在数据库中表达丰富的程序逻辑。JavaScript 运行时通过 GraalVM 集成,用户可以免费使用 GraalVM 的所有企业版 (EE) 功能,如编译器优化、性能和安全功能。
该版本支持:
基于 ECMAScript 2021 的 JavaScript 语言 存储过程和存储函数 MySQL 数据类型,如整数、浮点数和 CHAR/VARCHAR 类型的所有变化
ECMAScript 标准库包括许多基本的使用操作和数据结构,使实现变得简单而富有表现力。开发人员还可以从在线软件包管理器(如 "npm")中重用数百万个可用的第三方软件包。
1.4.什么是 GraalVM?
GraalVM 是 Oracle 的编译器生态系统,包括 JDK 以及 JavaScript、R、Python、Ruby 和 Java 等语言实现。它包括即时(JIT)和超前(AOT)编译技术。它还提供了一个完全托管的虚拟机,具有沙箱功能和工具支持。MySQL-JavaScript 与 GraalVM 企业版集成。
2.MySQL-JavaScript 应用实践
2.1.定义 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 存储过程类似。存储过程支持输入和输出参数。
2.2.在 SQL 语句内执行 JavaScript 代码
JavaScript 函数可以在任何可以调用传统 SQL 函数的 SQL 语句中调用,如 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;
2.3.调试 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>
3.MySQL-JavaScript 优势
3.1.公认的安全性
MySQL 中的 JavaScript 支持可提供最高级别的安全性、隔离性和数据保护。MySQL 的 JavaScript 依赖于业界公认的 Oracle GraalVM 安全保证。
虚拟机沙盒可确保恶意代码无法入侵 MySQL 服务器的其他模块。每个存储程序都在自己的上下文中解析和执行。这种隔离策略不允许一个存储程序读取或修改其他存储程序的数据或代码。JavaScript 用户代码生成或操作线程受到限制,而且 JavaScript 用户代码无法访问网络通信或文件系统。
JavaScript 存储程序基于标准的 MySQL 权限模型。只有有权限的用户才能创建存储程序。对 SP 的访问也可以通过权限来控制。一个用户可以定义其他用户可以执行的存储程序。
3.2.良好的兼容性
JavaScript 存储程序可与传统的 SQL 存储程序无缝兼容。该功能与存储引擎无关,可以透明地从 InnoDB、Lakehouse 和 HeatWave 访问数据。
MySQL Heatwave 服务现在已在 OCI、AWS 和 Azure 服务部署中预装并配置了 JavaScript。对于 MySQL 企业版,该功能需要手动安装和配置。
3.3.最佳的性能
MySQL-JavaScript 集成针对其特定用例使用定制的虚拟机,以实现最佳的端到端性能。这种定制基于 GraalVM 的超前(AOT)编译,将语言实现编译成本地二进制表示法,以便快速处理。
GraalVM 拥有自己基于 ECMAScript 2021 标准的 JavaScript 实现。该语言实现在性能方面很有竞争力,尽管它是使用 GraalVM 的 Polyglot 框架实现的,该框架侧重于在同一虚拟机中支持多种编程语言。
最后,MySQL-JavaScript 功能还得益于 GraalVM 企业版的各种先进优化技术,如编译器优化,包括积极的内联和部分转义分析。这还包括一个配置文件引导的即时(JIT)编译器,可在运行时在解释器和本地编译之间切换。
4.MySQL-JavaScript 带来哪些利好?
随着全栈开发岗位在国内外的普及,越来越多的开发者开始转变全栈开发人员或者工程师。全栈开发在大部分情况下对前端、后端、运维工程师的工作职责进行了整合,主要包括前端、后端 和 DevOps。在 MySQL 中将引入对 JavaScript 的支持,对于前端或者全栈开发人员来说有以下好处:
继浏览器、服务端、客户端之后,JavaScript 语言深入到数据库领域。 对于全栈开发人员,可以使用 JavaScript 在数据库中处理更丰富的逻辑。 对于前端开发人员,上手 MySQL-JavaScript 的成本将会更低一些。
5.总结
MySQL-JavaScript 使开发人员能够直接在 MySQL 服务器中表达复杂的编程逻辑。这样,开发人员就能将应用程序中的数据密集型部分推近数据,从而降低数据移动成本。使用基于 ECMAScript 2021 的 JavaScript 可以防止供应商锁定问题,同时开发人员还可以享受 GraalVM(企业版)的所有优势,而无需支付额外费用。要免费试用 MySQL-JavaScript,请从 Oracle Technology Network (OTN) 下载 MySQL 企业版。MySQL-JavaScript还与MySQL HeatWave云服务无缝集成,开发人员可通过指尖获得最新的创新技术。MySQL向 JavaScript 集成的转变预示着开发人员将获得更多功能和更易用的环境。
关注FED实验室(前端开发实验室)获取更多前端热点资讯、技术实践、面试招聘等精彩内容。