首页
Preview

“Oracle DB 23c免费开发者版本”对Java开发者有哪些新内容?

自由的啤酒

Oracle Database 23c Free — Developer Release” 是一款功能齐全的 Oracle 数据库,专为开发者而设计,无需点击,已经发布在 Free Use Terms & Conditions license 下,更多详情请参见此处

它为 Java 开发者带来了新功能。这篇博客文章将重点介绍我的最爱功能,其他功能将在随后的博客文章中详细介绍。

我最喜欢的酷 Java 功能

我完全有偏见!我将介绍数据库流水线操作的 Java 支持,关系型-JSON 双重性视图和自驱动诊断。

1 — Java 和流水线数据库操作

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

图 1 — 流水线 vs 非流水线数据库操作

Java 开发者将通过 Oracle JDBC Reactive Extensions、Reactive Streams 库、虚拟线程和标准 JDBC 批处理来利用数据库流水线。

JDBC Reactive Extensions 和数据库流水线

JDBC Reactive Extensions 在 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' Reactive Extensions 的一部分——以组合流水线。在后面的示例中,将展示使用虚拟线程编程模型进行反应和同步消耗结果的细节。

在上面的示例中,调用 unwrap(OraclePreparedStatement.class) 用于访问 Reactive Extensions API 的方法,即 executeUpdateAsyncOracleexecuteQueryAsyncOracle。这些方法返回一个 Flow.Publisher。当接收到每个 SQL 语句的结果时,发布者将向订阅者发出 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 的流转换为多个行值的流。

虚拟线程和数据库流水线展望未来,虚拟线程(Project Loom)是反应流的替代品,并被誉为 Java 可扩展性的未来。自 21.1 版本以来,Oracle JDBC 已经被虚拟线程(Project Loom)仪器化。具体来说,驱动程序将不会通过在 I/O 调用期间持有内部锁来导致线程固定。有关更多详细信息,请参见:http://cr.openjdk.java.net/~rpressler/loom/loom/sol1_part1.html#pinning。使用虚拟线程,异步 API(如反应流)可以轻松地转换为同步代码。虚拟线程只需要阻塞其执行,直到接收到异步结果。为了证明这一点,可以将前一节中的代码示例重新编写如下:

使用虚拟线程的同步 DB 流水线;请单击此处查看完整的代码。

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

标准 JDBC 批处理

一旦使用 JDBC 批处理 API(即 s_tmt.addBatch() 或 prepstmt.addBatch())开始使用 Oracle JDBC 驱动程序,驱动程序将立即启动数据库流水线,使用 JDBC Reactive Extensions 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.sql.json 包中的Oracle JDBC,你可以从John的时间表中检索特定属性的值。

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

3 — JDBC自驱诊断

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

虽然已经消除了调试和指标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开发人员可以在去除敏感数据的情况下共享跟踪。敏感模式只能由特权用户启用,并由两个开关控制;一个用于启用,另一个用于允许。只需要允许属性。如果在java命令行中包含了permit属性,则可以在运行时以编程方式启用和禁用敏感模式,或通过MBean进行启用。如下所示,也可以通过启用属性来启用。-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中有_本地布尔数据类型_。

布尔类型示例

  • 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本机数据源连接到Sharded Oracle数据库的Java应用程序可以参与由WebLogic Transaction Manager (TM)管理的JTA/XA事务。
  • Oracle JVM支持HTTP和TCP访问,同时禁用其他操作系统调用。在多租户环境中的数据库安全中查看更多详细信息。

译自: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)

添加评论