5

MySQL 中引入 JavaScript 支持

 7 months ago
source link: https://www.fly63.com/article/detial/12637
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

MySQL 不断加速创新,现在在数据库中包含丰富的过程编程功能。开发人员现在可以在 MySQL 数据库服务器中编写 JavaScript 存储程序。存储的程序将与GraalVM运行时一起运行。它在 MySQL 企业版中作为预览版提供,并且可以通过Oracle 技术网 (OTN)下载。MySQL-JavaScript 还可在 OCI、AWS 和 Azure 上的 MySQL Heatwave 云服务中使用。

为什么选择 JavaScript 存储程序?

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

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

对JavaScript存储程序的支持,不仅可以利用庞大的生态系统来提高开发人员的生产力;现在,更多的开发人员将具备编写存储程序所需的技能。换句话说,组织现在可以利用广泛可用的 JavaScript 技能集进行后端开发,从而挖掘更广泛的开发人才。

存储程序的一个关键优势是最大限度地减少数据库服务器和应用程序之间的数据移动。由于多种原因,传输大量数据(尤其是批处理数据)可能会出现问题:

  1. 它非常耗时,并且可能会导致大量的网络开销。
  2. 当应用程序“喋喋不休”时,延迟的增加可能会变得明显。
  3. 在中间层或应用层处理大量数据需要大量内存和存储,从而增加了成本。
  4. 由于安全风险和数据保护要求,通常必须避免机器之间的数据传输,尤其是在云环境中。
  5. 将大量数据移至数据库服务之外会增加出口成本。使用存储程序处理数据库中的数据是解决这些问题的常见方法。

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

  1. 数据提取:从数据库中常用的复杂对象中提取信息,例如URL字符串。
  2. 数据格式化:使用广泛使用的模板化方案(例如 JavaScript Mustache 包)生成格式化字符串。
  3. 近似搜索:在 SELECT 查询中使用相似性评分函数,例如,从表中检索相似的字符串。
  4. 数据验证:使用复杂的验证规则清理数据。例如,使用 JavaScript Validator 包。
  5. 压缩/编码:使用 MySQL 中未包含的自定义算法进行数据压缩和加密。
  6. 数据转换:更改数据表示形式,例如将字符串列转换为特征工程中使用的稀疏矩阵表示形式。提供的示例只是对该功能潜力的一瞥。存在更复杂的用例,例如部署完整的数据管道和为机器学习应用程序设置暂存环境。

MySQL-JavaScript

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

此版本支持:

  1. 基于 ECMAScript 2021的 JavaScript 语言 存储过程和存储函数
  2. MySQL 数据类型,例如整数、浮点和 CHAR/VARCHAR 类型的所有变体
  3. 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 代码

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;

在 MySQL 中调试 JavaScript 代码

调试与软件开发密切相关。MySQL-JavaScript 功能公开了额外的 SQL 接口以帮助故障排除,而 JavaScript 程序在数据库中运行。

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 支持提供最高级别的安全性、隔离和数据保护。JavaScript for MySQL 依赖于经过行业验证的 Oracle GraalVM 安全保证。

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

JavaScript 存储程序构建在标准 MySQL 权限模型之上。仅允许特权用户创建存储程序。对SP的访问也可以通过权限进行控制。一个用户可以定义可由其他人执行的存储程序。

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

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

MySQL-JavaScript 集成使用针对其特定用例定制的 VM,以实现最佳的端到端性能。这种定制基于 GraalVM 的提前 (AOT) 编译,其中语言实现被编译为本机二进制表示形式以进行快速处理。

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

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

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

来自:https://www.sibida.net/detail/7942

链接: https://www.fly63.com/article/detial/12637


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK