MySQL也开始支持JavaScript了

2023 年 12 月 16 日,Oracle 公司在一篇名为 《Introducing JavaScript support in MySQL》的文章中宣布 MySQL 数据库服务器将开始支持 JavaScript 语言。

这个举措标志着继PostgreSQL之后, MySQL 也支持使用 JavaScript 编写函数和存储过程了。作为最流行的开源数据库,这一消息在技术界引起了广泛关注。

PostgreSQL 通过其PL/v8扩展自 2012 年起就已经支持 JavaScript​​​​​​​。当前所有版本均支持 PLV8,包括像 Amazon RDS 这样的托管服务,并可用在存储过程和触发器中。

这一新功能目前仅在 MySQL 企业版和 MySQL Heatwave 中提供,并处于预览阶段。开发人员现在可以在 MySQL 数据库服务器中编写 JavaScript 存储过程(函数和过程)。存储的程序将与 GraalVM 运行时一起运行。

*存储过程(Stored Procedure)

存储过程是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。存储过程是为了完成特定功能的 SQL 语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。MySQL 5.0 版本开始支持存储过程。

为什么使用 JavaScript 存储过程?

JavaScript 是最流行的编程语言之一,除了更简单的语法和对现代语言特性的支持外,它受欢迎的一个关键因素是丰富的生态系统,它在浏览器、服务端、客户端等场景提供了大量可重用的代码模块。

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

对 JavaScript 存储过程的支持,不仅会通过利用大型生态系统来提高开发人员的生产力;现在,更多的开发人员将拥有编写存储过程的必要技能。换句话说,公司企业现在可以利用广泛访问的 JavaScript 技能集进行后端开发,从而挖掘更广泛的开发人员人才。

存储过程最大限度地减少了数据库服务器和应用程序之间的数据移动,从而提供了一个关键优势。

传输大量数据,特别是批处理数据,可能会出现问题,原因有很多:

  • 这是非常耗时的,并且可能会导致大量的网络开销。
  • 当应用程序进行频繁交互时,延迟的增加可能会变得明显。
  • 在中间层或应用层处理大数据量需要大量的内存和存储,增加了成本。
  • 由于安全风险和数据保护需求,通常必须避免机器之间的数据传输,特别是在云环境中。
  • 将大量数据移出数据库服务将增加出口成本。

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

p-01

使用场景

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

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

所提供的示例只是对该特性潜力的一瞥。还有更复杂的用例,比如部署完整的数据管道和为机器学习应用程序设置登台环境。

MySQL-JavaScript

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

此版本支持:

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

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

*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、Views 等中。下面是一个 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>

各项指标

安全性

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

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

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

兼容性

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

MySQL 热浪服务现在在 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 Technology Network (OTN)下载 MySQL 企业版。MySQL- javascript 还与 MySQL HeatWave 云服务无缝集成,开发人员只需动动指尖即可获得最新的创新。

另外,有关 MySQL 对 JavaScript 支持的详细描述文档可以见:https://downloads.mysql.com/docs/mysql-manual-js-preview.en.pdf

作者联系方式

michealwayne@163.com
GitHub:http://github.com/MichealWayne


相关链接
  • Oracle 《Introducing JavaScript support in MySQL》:https://blogs.oracle.com/mysql/post/introducing-javascript-support-in-mysql
  • Oracle 《MySQL 8.3 Reference Manual——JavaScript Programs Technology Preview》:https://downloads.mysql.com/docs/mysql-manual-js-preview.en.pdf
  • InfoQ 《MySQL 支持 JavaScript,目前处于预览阶段》:https://www.infoq.cn/article/6bT6kDa1ADuCKeTU4VlI
  • code 秘密花园 《MySQL 正式引入 JavaScript 支持!》:https://mp.weixin.qq.com/s/5XGhgs5PI9RPwHD0RjbroA

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/343099.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JAVA:OFD Reader Writer 开源库技术解析

1、简述 OFD Reader & Writer 是一个由开源社区推动的 OFD 文件处理库&#xff0c;它旨在提供对 OFD 格式文件的读取和写入功能。这一开源项目为开发者提供了强大而灵活的工具&#xff0c;使得在应用程序中处理和生成 OFD 文件变得更加容易和高效 开源地址&#xff1a;htt…

中文数据让LLM变笨?

我这里先贴一下论文的原链接&#xff1a; https://arxiv.org/abs/2401.10286 然后贴一下我翻译标注的下载链接&#xff1a;https://gitee.com/chatpaper/arXiv_top_chinese/blob/master/0801_top/%E4%B8%AD%E6%96%87%E4%BC%9A%E8%AE%A9LLM%E5%8F%98%E7%AC%A8%EF%BC%9F.pdf 先…

Nginx查看并发连接数

前言 需要依赖于nginx的http_stub_status_module模块http://nginx.org/en/docs/ 查看是否已经安装此模块 windows: linux: 添加/status 在server段内&#xff0c;添加如下配置&#xff1a; server {listen 80;server_name localhost;root "D:/WWW/local…

huggingface学习|云服务器部署Grounded-Segment-Anything:bug总会一个一个一个一个又一个的解决的

文章目录 一、环境部署&#xff08;一&#xff09;模型下载&#xff08;二&#xff09;环境配置&#xff08;三&#xff09;库的安装 二、运行&#xff08;一&#xff09; 运行grounding_dino_demo.py文件&#xff08;二&#xff09;运行grounded_sam_demo.py文件&#xff08;三…

机器学习期末复习总结笔记(李航统计学习方法)

文章目录 模型复杂度高---过拟合分类与回归有监督、无监督、半监督正则化生成模型和判别模型感知机KNN朴素贝叶斯决策树SVMAdaboost聚类风险PCA深度学习范数计算梯度下降与随机梯度下降SGD线性回归逻辑回归最大熵模型适用性讨论 模型复杂度高—过拟合 是什么&#xff1a;当模型…

OSPF基础华为ICT网络赛道

6.1.OSPF协议概述 由协议之中OSPF(Open Shortest Path First,开放式最短路径优先)协议是使用场 景非常广泛的动态路由协议之一。 OSPF在RFC2328中定义&#xff0c;是一种基于链路状态算法的路由协议。 静态路由是由工程师手动配置和维护的路由条目&#xff0c;命令行简单明确…

用Go plan9汇编实现斐波那契数列计算

斐波那契数列是一个满足递推关系的数列&#xff0c;如&#xff1a;1 1 2 3 5 8 ... 其前两项为1&#xff0c;第3项开始&#xff0c;每一项都是其前两项之和。 用Go实现一个简单的斐波那契计算逻辑 func fib(n int) int {if n 1 || n 2 {return 1}return fib(n-1) fib(n-2) …

Nuxt2.x Error页面返回自定义请求状态码

一、问题描述 最近接到一个需求&#xff0c;针对Nuxt2.x的一个项目进行SEO优化&#xff0c;需要对404页面的状态进行修改&#xff0c;将404页面的请求状态码改为301&#xff0c;而不是404&#xff1a; 二、解决方案 1.几种无效尝试 &#xff08;1&#xff09;layouts下的err…

云原生全栈监控解决方案(全面详解)

【作者】JasonXu 前言 当前全球企业云化、数字化进程持续加速&#xff0c;容器、微服务等云原生技术在软件架构中快速渗透&#xff0c;IT 架构云化、复杂化持续驱动性能监控市场。企业云化、数字化持续转型&#xff0c;以及为了考虑系统的弹性、效率&#xff0c;企业软件开发中…

最强生产力|卸载并重装Anaconda3

一、Anaconda3卸载 &#xff08;一&#xff09;官方方案一&#xff08;Uninstall-Anaconda3-不能删除配置文件&#xff09; 官方推荐的方案是两种&#xff0c;一种是直接在Anaconda的安装路径下&#xff0c;双击&#xff1a; &#xff08;可以在搜索栏或者使用everything里面搜…

HTTP代理在Python网络爬虫中的应用

网络爬虫是Python中一个非常重要的应用领域&#xff0c;它能够自动抓取互联网上的信息。然而&#xff0c;在进行网络爬虫的过程中&#xff0c;我们经常会遇到一些问题&#xff0c;其中最常见的问题就是被目标网站封禁IP地址。为了解决这个问题&#xff0c;我们可以使用HTTP代理…

ruoyi框架教程

心血来潮&#xff0c;写一篇关于ruoyi【若依】框架从0-1的教程。说一下使用感受吧&#xff0c;如果有一个架构师或者老手已经把架构改造完成也能指导你如何快速上手&#xff0c;那么你在后面的增删改查系列开发起来会如鱼得水。如果没有人改造&#xff0c;也没有人教你&#xf…

Dart基础语法——变量、数据类型

前言&#xff1a;新年新气象&#xff0c;开卷吧老铁们&#xff01; 本文主要介绍 Flutter 开发中 Dart 的基本语法&#xff0c;后续会更新到如何使用 Flutter 开发 Android 与 IOS 及 使用 Flutter 如何开发 Apple Wacth 应用。 学习 Dart 语法的阶段&#xff0c;编辑器使用的是…

用友 GRP U8 UploadFile 命令执行漏洞

文章目录 前言声明一、漏洞描述二、影响版本三、漏洞复现 前言 用友GRP-U8是一款功能全面、灵活度高、可定制性强的ERP软件&#xff0c;能够协助企业实现资源的高效管理&#xff0c;优化企业运营流程&#xff0c;提升整体管理水平。该产品存在任意文件上传漏洞。 声明 请勿利…

小型园区组网实例

目录 拓扑需求IP规划路由配置交换机配置NAT配置ACL配置DHCP配置配置过程&#xff1a;配置结果&#xff1a; OSPF配置链路聚合配置配置过程&#xff1a; 网络测试 拓扑 需求 企业网络信息服务平台需实现功能&#xff1a;企业网站服务器、FTP服务器、DNS服务器。企业ip分配地址段…

linux基础学习(6):压缩与解压

linux中常见的压缩格式有.zip、.tar、.gz、bz2、.tar.gz、.tar.bz2等十几种 1.zip命令 zip格式压缩包是唯一一种windows和linux可以通用的压缩包 linux系统其实不靠文件后缀来区分压缩包&#xff0c;添加后缀是为了方便使用者分辨 &#xff08;1&#xff09;压缩命令 zip …

【LeetCode-135】分发糖果(贪心)

LeetCode135.分发糖果 题目描述 老师想给孩子们分发糖果&#xff0c;有 N 个孩子站成了一条直线&#xff0c;老师会根据每个孩子的表现&#xff0c;预先给他们评分。 你需要按照以下要求&#xff0c;帮助老师给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。…

什么是ORM思想?

1. ORM概念 ORM&#xff08;Object Relational Mapping&#xff09;对象关系映射模式&#xff0c;是一种技术&#xff0c;解决了面向对象与关系型数据库存互不匹配的现象。 ORM在业务逻辑层和数据库层之间充当了桥梁的作用。 2. ORM由来 在软件开发的过程中&#xff0c;通常…

Linux系统Shell脚本 ----- 编程规范和变量详细解读

一、Shell脚本概述 1、什么是Shell Linux系统中运行的一种特殊程序在用户和内核之间充当“翻译官”用户登录Linux系统时&#xff0c;自动加载一个Shell程序Bash是Linux系统中默认使用的Shell程序 2、Shell的作用 Linux系统中的shell是一个特殊的应用程序&#xff0c;它介于操…

JVM如何找到并清理垃圾?

如何找到垃圾 若一个对象不被任何对象或变量引用&#xff0c;那么它就是垃圾&#xff0c;需要被回收。 如何找到这个垃圾呢&#xff1f; •引用计数法&#xff08;Reference Counting&#xff09; •可达性分析法&#xff08;GCRooting Tracing&#xff09; 引用计数法 在对…