首页
Preview

“Oracle DB 23c免费开发者版本”对Java开发人员有哪些新特性?

自由,如啤酒一般的自由

Oracle Database 23c Free — Developer Release” 是一款功能齐全的Oracle数据库,专为开发人员设计,无需点击即可使用。它已经根据免费使用条款和条件许可证发布,详情请查看这里

它为Java开发人员带来了新的特性。本文将重点介绍我最喜欢的特性,其他特性将在随后的博客文章中详细介绍。

我最喜欢的Java特性

我有点偏见!我将介绍Java支持管道数据库操作、关系型JSON对等视图和自驱动诊断。

1 Java和管道数据库操作

数据库管道由多个数据库请求序列组成,这些请求在操作之间不等待响应而提交。当每个查询的结果准备好时,数据库会发送响应。管道数据库操作促进了一种异步编程模型,其中用户线程在提交SQL语句以执行而无需等待其执行和结果集时立即返回。

图1 — 管道与非管道数据库操作

Java开发人员将通过Oracle JDBC响应式扩展、Reactive Streams库、Virtual Threads和标准JDBC批处理来利用数据库管道。

JDBC响应式扩展和数据库管道

JDBC响应式扩展是在Oracle JDBC 21.1版本中引入的,它实现了Java Flow API,并将其扩展为异步的连接创建、SQL执行、行数据获取LOB I/O和事务控制(即提交/回滚)。该API完全符合Reactive Streams 1.0.3规范,并与响应式库生态系统(包括Spring、jOOQ、Helidon、Hibernate、Project Reactor、RxJava、Akka Streams等)进行交互。下面的代码介绍了调用AsyncOracle方法的概念——它是Oracle JDBCs的响应式扩展的一部分——以组合管道。在后面的示例中,将展示在使用虚拟线程编程模型时关闭语句和消耗响应的复杂性。

在上面的示例中,调用 unwrap(OraclePreparedStatement.class) 用于访问响应式扩展API的方法,即 executeUpdateAsyncOracleexecuteQueryAsyncOracle 。这些方法返回一个 Flow.Publisher 。每个SQL语句的结果到达时,Publisher会向Subscriber发出一个ResultSet。怎么做呢?JDBC通过轮询网络使用驱动程序上的单个选择器“侦听”每个SQL语句的数据库响应。在接收到数据库响应时,选择器调用回调函数读取消息。

Reactive Streams库和数据库管道

诸如Project Reactor、RxJava、Akka Streams、Spring、jOOQ、Helidon MP Reactive Streams、Hibernate Reactive等响应式库都公开了类似于 java.util.stream.Stream 的API。前一节中的代码示例可以扩展以使用Project Reactor的API。

请查看完整的代码示例这里

在上面的示例中,通过调用它们的“from”方法创建了Mono和Flux的实例。该方法的参数是一个 org.reactivestreams.Publisher ,它通过调用 org.reactivestreams.FlowAdapters.toPublisher 从Flow.Publisher进行了适配。调用“subscribe”方法以异步使用回调函数消耗结果。要消耗多行结果,需要调用 Mono.flatMapMany ,将单个ResultSet的流转换为多个行值的流。

虚拟线程和数据库管道

展望未来,虚拟线程(项目Loom)是响应式流的替代方案,被认为是Java可扩展性的未来。自21.1版以来,Oracle JDBC已经被虚拟线程(Project Loom)所支持。具体而言,驱动程序不会通过在I/O调用期间持有内在锁来导致线程固定。有关更多详细信息,请参见:http://cr.openjdk.java.net/~rpressler/loom/loom/sol1_part1.html#pinning。使用虚拟线程,异步API(如Reactive Streams)可以轻松地转换为同步代码。虚拟线程只需要阻塞其执行,直到接收到异步结果。为了证明这一点,可以将上一节中的代码示例重写如下:

使用虚拟线程的同步DB管道;请查看完整的代码这里

与上一节代码示例的方式相同,每个 Flow.Publisher 都将从Project Reactor API转换为Mono或Flux。但是,使用虚拟线程,不再需要异步消耗结果。虚拟线程只需调用_block()_方法阻塞,直到接收到异步调用的结果。然后,可以使用命令式编程以传统的方式处理结果。

标准JDBC批处理

只要开始使用JDBC批处理API(即 s_tmt.addBatch()prepstmt.addBatch() ),Oracle JDBC驱动程序就会启动数据库管道,驱动程序在内部使用JDBC响应式扩展API生成异步调用。## 2 - Java与JSON-关系二元视图

许多应用程序需要简单性(自描述、自包含和无模式)、开发的便利性(即以编程方式访问JSON数据)、分层数据、常见的交换格式(易于在网络上传输)以及将JSON易于转换为Java类型的效率(同样地),同时需要SQL的空间管理、可查询性、一致性和强大的分析和报告能力。JSON-关系二元视图是将关系数据作为JSON文档呈现。此功能为开发人员提供了关系和JSON世界的最佳方案。更多细节可以在此处找到。

如何设置和使用JSON-关系二元视图?

  • 创建和填充常规关系表(或重用现有表)。例如,学生、教师和课程表。
  • 基于用例创建一个或多个JSON-关系二元视图,使用SQL可视化工具、SQL CLI或使用JDBC Statement.execute("…")编程方式。每个视图都包括利用多种功能。以下SQL代码片段将基本表列映射到JSON名称/值对。

将表列映射到JSON名称/值对

以下SQL代码使用子查询扩展了前面的代码,将嵌套数据组装成JSON数组。

使用子查询将嵌套数据组装成JSON数组

以下SQL语句通过指定更新规则完成了前面的工作。

声明更新规则:学生可以更新学生的课程表,但不能更新班级或教师的课程表

就这样!你现在可以直接使用以下查询针对JSON文档进行工作,该查询将John的课程表作为JSON文档返回。

在JDBC中查询JSON-二元视图

使用Oracle JDBC中的oracle.sql.json包,你可以从John的课程表中检索特定属性的值。

从JSON文档中检索属性值的基本示例

3 - JDBC自驱动诊断

使用Oracle数据库的每个Java开发人员都会赞赏以下声明:“不再在生产jar和调试jar之间切换以调查问题”!所有用例(生产、调试、指标)都使用单个ojdbc jar(例如,ojdbc8.jar、ojdbc11.jar)。换句话说,不再使用调试的_ojdbc8_g.jar或ojdbc11_g.jar_,不再使用用于Oracle动态监视服务(DMS)指标的_ojdbc8dms.jar或ojdbc11dms.jar_,也不再使用_ojdbc8dms_g.jar或ojdbc11dms_g.jar_进行DMS调试。

尽管已经消除了调试和指标jar,但核心JDBC jar提供了增强的日志记录、调试(首次故障诊断)和执行跟踪功能。

日志记录:核心JDBC Jars(即_ojdbc8.jar_或_ojdbc11.jar_)包括需要使用以下属性打开的日志记录功能:-Doracle.jdbc.diagnostic.enableLogging=true ,此外,日志记录配置文件的位置为 -Djava.util.logging.config.file=./logging.config ,日志记录配置文件的内容为

handlers = java.util.logging.ConsoleHandler
oracle.jdbc.level = FINEST
java.util.logging.ConsoleHandler.level = FINEST
java.util.logging.ConsoleHandler.formatter =
oracle.jdbc.diagnostics.OracleSimpleFormatter

首次故障诊断:此功能诊断第一次出现的故障。它记录内存中的关键执行状态,然后在错误时转储记录。它默认为开启状态,但是你可以通过将CONNECTION_PROPERTY_ENABLE_DIAGNOSE_FIRST_FAILURE属性设置为FALSE(默认值)或通过DiagnosticMBeans接口来禁用它。

出于安全考虑,每个诊断功能都有两种模式:公共模式和敏感模式。在公共模式下,这些功能不记录或持久化敏感信息。这严重限制了捕获的信息量并降低了诊断功能的有效性。在敏感模式下,这些功能记录并持久化敏感信息。Java开发人员可以共享具有敏感数据遮蔽的跟踪信息。敏感模式只能由特权用户启用,并由两个开关控制;一个用于启用,另一个用于允许。只需要permit属性。如果java命令行中包含permit属性,则可以在运行时通过编程方式或通过MBean启用和禁用敏感模式。也可以通过如下方式启用enable属性。 -Doracle.jdbc.diagnostic.enableSensitiveDiagnostics=true -Doracle.jdbc.diagnostic.permitSensitiveDiagnostics=true

你必须配置java.util.logging(参见上文)才能获得诊断输出。

执行跟踪:此功能记录执行序列详细信息。JDBC驱动程序还配备了用于跟踪数据库往返的钩子;此钩子启用了OpenTelemetry的支持。简而言之,可以使用第三方库(如_OpenTelemetry-JDBC_)启用OpenTelemetry,无需更改代码。可以监视所有顶级调用;Java代理为JDBC调用创建一个跨度。稍后的博客文章将详细介绍此功能。

DMS指标:如果类路径中存在_dms.jar_,则记录DMS指标。注意: 你必须权衡记录状态信息的数量与记录成本之间的平衡。由于执行跟踪涉及重大成本,建议你仅在有限的上下文中启用它。

其他 Java 好东西

  • 在 oracle.jdbc.OracleType 中的_Native Boolean datatype_。

布尔类型示例

  • JDBC-Thin 支持长度达 1024 字节的密码
  • JDBC-Thin 支持基于令牌的身份验证,包括 Oracle Cloud Infrastructure (OCI) Identity Access Management (IAM) 和 Azure Active Directory (Azure AD)。了解更多信息,请单击此处
  • JDBC-Thin 支持 RADIUS 和 RADIUS 双因素身份验证,其中 RADIUS 服务器要求对显示的挑战响应有效。了解更多信息,请单击此处
  • JDBC 支持基于目录的分片和分裂分区集。没有公共的 Java API,但在分区集分裂期间,在幕后,客户端连接池接收有关数据块被分裂并移动到分区集的 ONS 事件,并相应地更新其分片拓扑。
  • UCP 支持与 Oracle 数据库分片一起使用 XA 事务。使用 WebLogic Server 中的 UCP 本机数据源连接到分片的 Oracle 数据库的 Java 应用程序可以参与由 WebLogic 事务管理器 (TM) 管理的 JTA/XA 事务。
  • Oracle JVM 支持 HTTP 和 TCP 访问,并禁用其他操作系统调用。在多租户环境中的数据库安全中查看更多详细信息。

总结

我相信这篇文章会激发你基于_Oracle Database 23c Free — Developer Release_中的新 Java 特性设计新项目或重新设计现有项目。感谢你的阅读。@kmensah #javaOracleDB http://oracle.com/jdbc

译自:https://kuassimensah.medium.com/whats-in-oracle-db-23c-free-developer-release-for-java-developers-26931081682c

版权声明:本文内容由TeHub注册用户自发贡献,版权归原作者所有,TeHub社区不拥有其著作权,亦不承担相应法律责任。 如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

点赞(0)
收藏(0)
阿波
The minute I see you, I want your clothes gone!

评论(0)

添加评论