ラベル Database の投稿を表示しています。 すべての投稿を表示
ラベル Database の投稿を表示しています。 すべての投稿を表示

[Database] Blockchain Tableの登場/Native Blockchain Tables Extend Oracle Database’s Multi-model Converged Architecture

原文はこちら

出ました!Oracle OpenWorld 2019で初めにアナウンスされ、こちらの私のブログポストでご紹介したBlockchain Tableが、Oracle CloudのDatabase as a ServiceでのOracle Database 20cのPreview Releaseのお知らせで述べられている通り、実際に出てきました。というわけで、Blockchain Tableとはなんなのか、どうして重要なのかについて解説したいと思います。

Blockchain Tableは、Oracle Databaseの中で使える、高い耐タンパ性を備えた永続化オプションを提供する、データベーステーブルの新たな特殊なタイプです。Blockchain TableではINSERTのみを行うオペレーションが行える一方で、UPDATEなどの修正は許可されておらず、削除にも制約があります。耐タンパ性を向上するために、ある行にはその前の行のハッシュが保持されており、これにより改ざんされていないことをユーザーは確認できます。また、オプションとして行の内容についてX.509証明書を利用したPKIベースの電子署名で署名することができ、これらの署名とデータ完全性は検証できるので、確実な否認防止を実現することもできます。
Blockchain Tableを用いることで、ユーザーはアプリケーション透過的に他のユーザーによる偽造、改ざんを防ぐことができます。また、データへの署名および検証により、アプリケーション提供者による内部不正も防ぐことができます(「信頼するが検証もする」)。非中央集権アプリケーションならばOracle Blockchain Platformの非中央集権化された信頼のモデルを活用できる一方で、今日におけるほとんどのアプリケーションは中央集権的な権威(銀行、エスクロー機関、取引所や交換所、行政など)を持っています。Oracle Database内のBlockchain Tableを活用することで、このような中央集権的アプリケーションを、非中央集権モデルへと変更することによる複雑さの増加ナシで、よりセキュアにすることができるのです。これこそがまさにOracle Database 20c Native Blockchain Tableの存在理由です。例を挙げれば、金融取引の履歴、監査証跡、規制対応のコンプライアンスデータ、SOX-404管理対象の金融レコード、訴訟ホールドされたデータ、証拠保全などがあります。Blockchain Tableをこれらに用いることで、アプリケーションをよりセキュアにし、データに耐改ざん性を付与することができます。
上に挙げたような例では、ブロックチェーンネットワークと非中央集権アプリケーションを構築するよりも格段に簡単にBlockchain Tableを使うことができるでしょう。この機能はOracle Databaseの一部として提供されるため、新しい基盤の導入は不要です。このテーブルを既存アプリケーションに透過的に使うこともできますし、開発者たちは既存のアーキテクチャとプログラミングモデルを保ったまま、SQLやPL/SQL、JDBCやその他のやり方でテーブルにアクセスできます。Blockchain Tableはさらに、他のテーブルと組み合わせてトランザクションやクエリを行うことができます。

一般的なデザインパターン

ひとつめのパターンは、変更されないデータ(例えばIoTデバイスから受け取ったデータ、コンプライアンスデータなど)を保持する必要があるアプリケーションの場合です。Blockchain Tableを作成し、こうしたデータを直接保存します。
ふたつめのケースでは、既存のアプリケーションが、通常のデータベーステーブル上での更新についての、耐改ざん性のある監査証跡を保持する必要がある場合です。追加でBlockchain Tableを作成し、既存のテーブルでの更新ごとにBlockchain Tableにレコードをインサートするようにアプリケーションを改修するか、あるいは既存のテーブルにトリガーを追加して更新の都度ストアドプロシージャを呼び出してBlockchain Tableにレコードを追加されるようにするかして、Blockchain Table上に監査証跡を保持するようにします。
分散したブロックチェーンネットワークを使う非中央集権アプリケーションに関わる別のシナリオもありますね。しばしばこうしたアプリケーションでは、電子医療記録(EHR)や画像、法的な合意情報や契約情報などの、大きなサイズのデータを保持する必要があります。分散ネットワーク上ではノード間で多数のメッセージがやり取りされるため、MB級やドキュメントやGB級の画像などは大きなネットワーク負荷につながります。より適切なアプローチとしてレコードのアンカリング(データのハッシュ値を取り、メタデータとともにオンチェーンに保持する)を分散台帳上で行いつつ、実データ内容はオフチェーンのデータストア、例えば耐改ざん性のあるBlockchain Table、に保持する、というものがあります。テーブルの耐改ざん性と、ブロックチェーン上のアンカリングを組み合わせることによって、データの改ざんをより一層難しくできるというわけです。
と、ここまでBlockchain Tableがどうして重要なのかについて説明してきたので、ここからはどうやって使うのかを説明していきましょう。

Blockchain Tableの作成と利用

Oracle Database 20cでは、Blockchain TableのためにDDLと有用な関数を備えた3つのPL/SQLパッケージが変更、追加されています。このあとのハンズオンを実際に試してみたい場合は、Oracle Cloud Database as a Serviceを使って、Databaseインスタンスを立ち上げて、お好みのデータベースクライアント(SQL Developerなど)で接続して実施してください。

新しいDDL

新規追加されたDDLであるCREATE BLOCKCHAIN TABLEによって、Blockchain Tableを作成するとともにいくつかのパラメーターをセットできます。以下の例のように:
   CREATE BLOCKCHAIN TABLE bank_ledger (bank varchar2(128), EOD_deposit NUMBER, ...)  \
       NO DROP UNTIL 31 DAYS IDLE \
       NO DELETE LOCKED \
       HASHING USING "sha2_512" VERSION "v1“;
このリリースでサポートされているデータタイプはNUMBER、VARCHAR2、RAW、JSON、BLOB、CLOB、DATEフォーマットおよび他のスカラータイプである点に留意ください。それ以外のタイプ、LONG、ADTs、TYPE、varray、OBJECTS、ROWID、BFILE、REF、Collectionsなどはサポートされていません。
上の例では3つの句が付与されていることにお気づきでしょう:
  1. NO DROP [UNTIL n DAYS IDLE] は必須の句です。これは、テーブルをドロップできないようにするか、あるいはテーブルがドロップできるようになるまでに必要となる一定の更新がない期間を設定するものです。nの最小値は16で、これはテーブルが自然と休眠するかもしれない、ほとんどの一般的な休暇期間の長さよりも長いです。ALTER TABLE句によってこのリテンションピリオドを変更することができます。
  2. NO DELETE [LOCKED] または NO DELETE UNTIL n DAYS AFTER INSERT [LOCKED] は削除ポリシーを管理する句です。真に永続する台帳のような場合のためには行の削除は禁止ができますし、あるいはn日のリテンションピリオド経過後には削除できるようにもできます。この場合もnの最小値は16です。NO DELETE(LOCKEDの有無に関わらず)またはNO DELETE UNTIL ... LOCKEDが指定された場合、この設定はあとから変更できません。LOCKEDを付けずにNO DELETE UNTILが指定された場合にはALTER TABLEでnの値を増やすことはできますが、減らすことはできません。
  3. HASHING USING "sha2_512" VERSION "v1“ も必須の句で、行のハッシュ計算にSHA2アルゴリズムを512bitの出力長で用いることを指定しています。将来Oracle Golden Gateや論理レプリケーションを用いて新しいDatabaseバージョン上にこのテーブルが複製された場合、新バージョンでは別のハッシュアルゴリズムやデータフォーマットバージョンがデフォルトになっているかもしれないため、確実に適切に複製されるようにこの句の指定を必須としています。
ALTER TABLEについては、Blockchain Tableでは上に挙げたものおよび制約を追加するもの以外にはほとんどの変更が許可されません。

Blockchain Tableの制約

データの変更不能性というブロックチェーンの基礎となる思想はBlockchain Tableというデータベースの実装に生かされています。Blockchain Tableでは、DMLでもダイレクトパスインサート(INSERT AS SELECTやSQL Loader)でもGolden Gate論理レプリケーションでも行を更新することはできません。さらに、以下のこともできません:
  • (テーブルにセットされたパラメータ次第で)リテンションピリオド内で、あるいはいつまでも、行の削除
  • カラムの追加、ドロップ、リネーム
  • パーティションのドロップ
  • 行の更新前トリガーのセット
  • Blockchain Tableを通常のテーブルに変換(またその逆も)
これらの制約により基礎的な操作からもBlockchain Table上のデータを保護し、また、データベースユーザーにより改ざんや偽造、履歴の書き換えなどを防ぐことができます。

行のチェーン化と署名

行が追加されると、Oracleによってマネージされる隠しカラムを用いて特殊なチェーン化プロセスが実行され、耐改ざん性を確実に実現します。これは、ブロックチェーンが前のブロックの暗号学的ハッシュを現データに含めるというやり方で耐改ざん性を実現していることと同様です。以前のデータが変更されるとハッシュが異なってくるため、現データに格納されているハッシュ値と食い違いを生じます。OracleのBlockchain Tableでは、1)現在の行のユーザーカラムと隠しカラムの「行の内容」(ユーザー署名カラムは除きます) および 2)前の行の隠しハッシュカラム の組み合わせに対してSHA2-512で計算されたハッシュ値が生成されます。行追加の並列処理およびハイパフォーマンスのため、32のチェーンが保持されます。また、RAC構成の場合にはRACインスタンスごとに32チェーンが保持されます。なので、厳密に言うと、「前の」行というのは、現在の行が属するある特定のチェーン上でひとつ少ないシーケンスナンバーを持っている行、ということになります。各カラムポジションごとのメタデータヘッダとcolumn-byte-valueが要素として連結された配列に、「前の」行の隠しハッシュカラムのメタデータとcolumn-byte-valueを連結したものを対象にSHA2-512ハッシュ計算が行われます。
これにより、万一データベース防御をなんらかの手段によりバイパスし、行を変更できたとした場合でさえ、深いレベルでデータを人知れず改ざんされることから保護することができます。ハッシュチェーンの整合性は下記のPL/SQLパッケージの関数で検証することができます。さらに、以下を用いることで管理者レベルでの改ざんからも保護することができます:
  • 暗号化およびDatabase Vaultを用いる
  • DBAのアクセス権限外にある外部のリポジトリに暗号学的ハッシュを定期的にコピーしておく
ビルトインされた暗号学的ハッシュによる行のチェーン化に加えて、下記のPL/SQLパッケージによりPKI(X.509)証明書を登録しておき、行が追加された際にユーザー署名を付与することができます。これによりユーザーや管理者が他者になりすましたり、あるいは他の誰かが自分になりすましたのだと主張することができなくなる、否認防止の特性をもたせることができます。もちろん、このために秘密鍵のセキュリティは大前提となりますし、誰かの秘密鍵が漏洩した場合に無効化して再発行する機能も必要です。

Blockchain Table PL/SQLパッケージ

PL/SQLでBlockchain Tableを扱うために、様々な関数を備えた3つのデータベースパッケージを提供しています。

DBMS_BLOCKCHAIN_TABLE

  • delete_rows():リテンションピリオド範囲外の行を削除する(将来リリースでdelete_expired_rows()にリネームされます)
  • verify_rows():チェーンの整合性を検証します
  • sign_row():インサート済の行にユーザー署名を格納します
  • get_bytes_for_row_hash():行のSHA2-512ハッシュを計算するための行の内容データフォーマットを返却します
  • get_bytes_for_row_signature():行のハッシュを返却します

DBMS_TABLE_DATA

  • get_bytes_for_column():指定されたカラムの{column-byte-value}を返却します
  • get_bytes_for_columns() :指定された(複数)カラムの{column-byte-value}*配列を返却します
  • get_bytes_for_row() :指定された行のすべてのカラムの{column-byte-value}*配列を返却します

DBMS_USER_CERTS

  • add_certificate(): “sys.user_certs$”の辞書テーブルに証明書を登録し、ユニークなGUIDを返却します
  • drop_certificate():“sys.user_certs$”テーブルから(存在していれば)指定された証明書を削除します

Viewを用いたBlockchain Tableの管理

2つのViewセットが事前定義されており、Blockchain Tableとユーザー証明書のメタデータ情報をクエリ、管理するのに役立ちます。
Blockchain Table用には:
  • ALL_BLOCKCHAIN_TABLES
  • DBA_BLOCKCHAIN_TABLES
  • USER_BLOCKCHAIN_TABLES
  • CDB_BLOCKCHAIN_TABLES
これらのViewは以下のカラム(名称は省略して記載しているので、フルの名称についてはドキュメントを参照ください)を持っています:SCHEMA_NAME(USER以外のViewに存在)、TABLE_NAME、ROW_RETENTION、ROW_RETENTION_LOCKED、TABLE_INACTIVITY_RETENTION、HASH_ALGORITHM、CON_ID(CDB Viewのみに存在)
ユーザー証明書については、以下のViewが定義されています:
  • DBA_CERTIFICATES
  • USER_CERTIFICATES
  • CDB_CERTIFICATES
これらのViewは以下のカラムを持っています:CERTIFICATE_GUID、USER_NAME、DISTINGUISHED_NAME、CERTIFICATE(BLOB)、CON_ID(CDB Viewのみに存在)

ベストプラクティス

  • 各インスタンスの各チェーンごとに、現在ハッシュと対応するシーケンスナンバーをレジャーデータベースの外部に定期的に保存し、チェーンの整合性検証を可能にしておく
  • Data Guardを使っている場合には、Max Protectionモードを使うことでレジャーレコードの喪失を防ぐ(プライマリでトランザクションがコミットされる前にスタンバイDBに同期でRedoが転送されコミットされる)
  • インサートされた行の、データベースによって生成されたハッシュ値について電子署名の計算を行う(DBMS_BLOCKCHAIN_TABLE.get_bytes_for_row_signature()
  • ハッシュと署名はデータベースの外部に保存しておき、将来的にそのデータベースが依然信頼に値するかを検証できるようにしておく

Blockchain TableとBlockchain Platformの使い分け

Oracle Database Blockchain Tables
Oracle Blockchain Platform
  • 単一の企業で使う場合、または、複数組織で使う、かつ中央集権的権威として扱うことができる中立機関が存在している
  • 高度な耐改ざん性を備えたストレージで既存のアプリケーションをセキュアにしたい
  • 非中央集権化は必要ない
  • 既存のアプリケーションアーキテクチャやプログラミング環境(SQL、PL/SQL、JDBC)にフィットしたものがほしい
  • 分散台帳を必要とする複数の組織が存在している
  • 複数組織で高度な相互運用性を持ったデータを共有したい
  • オープンソースおよび標準への志向
  • マルチシグネチャ、非中央集権的信頼が必要
  • 複数ノード間でスマートコントラクトを実行したい
例えば以下のようなユースケース
  • 不変のトランザクションログ、監査証跡を一元的に保持
  • コンプライアンスデータ
  • 金融/勘定台帳やサブ台帳テーブル
  • 訴訟ホールドデータ
  • 中央機関によって保持されたエスクロー情報
  • クリアリングハウスでのデータ照合
  • 証拠保全
Use cases involve
  • 非中央集権でのレコード保持、監査証跡の保持
  • 取引コミュニティ内でのサプライチェーンの来歴情報や正統性
  • 複数組織でのトランザクションログ…支払いやファンド送金、マーケットプレイス、アセットトークン化など
  • 複数発行体の絡むデジタル・アイデンティティや証明書
  • 複数組織に持つオブジェクト/ドキュメントに基づいたビジネス取引の照合と突合
  • マルチブランドのロイヤリティシステム
  • 金融サービスでのKnow-Your-Customer (KYC) ソリューション
  • サプライチェーンエコシステムでのKnow-Your-Supplier (KYS) ソリューション


準備はできましたか?

新たなNative Blockchain Table機能をこの20c Preview Releaseで触ってみるには?まずOracle Cloudのアカウントを用意して、Oracle Cloud Database as a ServiceでDatabase VMを作成しましょう。そしてお気に入りのデータベースクライアントでデータベースに接続し、CREATE BLOCKCHAIN TABLEしてください(必須の句は忘れずに!)。こんなに簡単です。質問などあれば通常のカスタマーサポート窓口からサポートも受けられますし、パブリックのフォーラムもありますよ。

[Cloud]Oracle Data Caching Cloud Serviceの発表/Announcing Oracle Data Caching Cloud Service

原文はこちら。
https://blogs.oracle.com/cloud-infrastructure/announcing-oracle-data-caching-cloud-service



Oracleはサンフランシスコで開催されたRedisConf2019で、エンタープライズ企業がRedisを構築し、運用するためのOracle Data Caching Cloud ServiceのLimited Availability(LA)リリースを発表しました。
Oracle Data Caching Cloud ServiceはOracle Cloud Infrastructure上で提供されるマネージド、シングルテナントのRedis-as-a-service(Redis-aaS)です。ネイティブの実行環境で稼働し、コンソール、REST API、CLI、SDKおよびTerraform経由で管理することができます。Oracle Data Caching Cloud Serviceによって、様々なデータ構造をサポートし、多くの場合クラウドネイティブアプリケーションとともに用いられるポピュラーなオープンソースのインメモリ分散Key-ValueデータストアであるRedisを利用するメリットを、インフラや複雑な運用の管理の手間なしに享受することができます。

Pay-Per-Use

Oracle Data Caching Cloud Serviceの課金体系とパッケージングは、シンプルで柔軟なモデルとなっています。お客様はキャッシュインスタンスが起動され、稼働している時間だけ課金されます。Pay-per-useにより、Oracle Data Caching Cloud Serviceは開発、テストおよび本番の様々なワークロードにとって理想的なプラットフォームとなっています。インスタンスの使用料は、シンプルな課金体系、すなわちキャッシュメモリ GB/hour によって測られます。

Open Source

オープンソースソフトウェアは開発者たちがソフトウェアを組み上げる方法を劇的に進歩させてきました。モダンなクラウドネイティブアプリケーションの開発プラットフォームの様々なコンポーネント――コンテナやKubenetes、キャッシング、SQL/NoSQL DB、ELKなど――がオープンソースプロジェクトとして開発されたものです。マネージドRedis-aaSをOracle Cloud Infrastructureの主要サービスとして提供することが示しているのは、開発者たちがパワフルなクラウドネイティブアプリケーションをOracle Cloud Infrastructure上で開発、稼働できるようにするために、付加価値つきのオープンソースソリューションにわれわれが注力しているということです。

Caching for Cloud

キャッシングは業務アプリケーションやクラウドサービスを構築するうえで、基礎となるコンポーネントです。Oracle Data Caching Cloud Serviceは、Oracle Cloud Infrastructure上でクラウドネイティブアプリケーションを、RedisをインメモリKey-Valueストアとして利用して構築しようとする開発者たちをターゲットとしています。Redis application tierのデプロイには、ComputeやContainer Engine for Kubernetes、Oracle Functionsなどのサービスがとりわけ向いているでしょう。
データベースのキャッシングもOracle Data Caching Cloud Serviceにとって重要なユースケースのひとつです。Autonomous Transaction Processingや、Database Cloud Service、MySQLやComputeサービス上で稼働する他のデータベースインスタンスのフロントエンドとしてキャッシングを用いることで、データアクセス速度を改善したり、データベースの処理をオフロードすることができるでしょう。

Enterprise Grade

他のOracle Cloud Infrastructureネイティブサービスと同様に、Oracle Data Caching Cloud Serviceはエンタープライズグレードのセキュリティ、パフォーマンス、可用性および管理性を備えています。Identity and Access Management(IAM)ポリシーにより、テナンシーやコンパートメントのユーザーに対してOracle Data Caching Cloud Serviceの権限を必要に応じて割り当てることができます。
さらに、どのVirtual Cloud Network(VCN)にOracle Data Caching Cloud Serviceのインスタンスがプロビジョニングされるかを予め設定しておくことができます。それぞれの新規インスタンスごとに、必要なデータキャッシング容量に応じて、キャッシュのシェイプを選択することができます。また、プライマリーとレプリカのRedisノードがそれぞれどのVCNの/どのアベイラビリティドメイン(AD)の/どのサブネットにプロビジョニングされるべきかも定義しておくことができます。Oracle Data Caching Cloud Serviceのインスタンスは、ひとつのプライマリRedisノードと、オプショナルな4つまでのレプリカノードから構成され、すべてを単一のアベイラビリティドメインで稼働させることも、単一リージョンの配下の複数のアベイラビリティドメインに分散させることもできます。
サービスインスタンスのヘルスおよびパフォーマンス情報はインスタンスモニタリングページから参照することができ、メトリックによりOracle Data Caching Cloud Serviceの主要なオペレーショナルデータをフィルタしたレポートが利用できます。

Getting Started

Oracle Data Caching Cloud Serviceは2019年後半にGA(Generally Available)となる予定です。現時点では、Cloud Native Limited Availability Programを通じ、何社かの限定されたお客様にお願いしてサービスの評価をしていただいているところです。Oracle Data Caching Cloud Serviceについてもっと詳しく知りたい、また、使ってみたいというお客様は、oracle.com/cloud-native/で登録をお願いします。Oracle Data Cloud Serviceのベースとなっているオープンソーステクノロジーについて学びたい場合は、redis.ioを訪ねてみるとよいでしょう。

[JavaScript, Database] node-oracledb 3.0 Introduces SODA Document Storage

原文はこちら。
https://blogs.oracle.com/opal/node-oracledb-30-introduces-soda-document-storage

Release announcement:

Node-oracledb 3.0.0(Oracle DatabaseへアクセスするためのNode.js用モジュール)がnpmからご利用いただけるようになりました。
node-oracledb version 3.0
https://www.npmjs.com/package/oracledb

Top features:

  • Simple Oracle Document Access (SODA) (プレビュー)
  • 接続プールの廃棄
  • Callタイムアウト
Node-oracledb 3がリリースされました。このリリースではいくつかのOracle DatabaseおよびOracle Client 18cの機能をサポートしています。
以前のバージョンのように、node-oracledb 3はOracle Clientライブラリ11.2以降と組み合わせて利用できますので、クライアントバージョンに依存しますが、Oracle Database 9.2以後と接続できるようになります。ただ、Oracle Client 18.3ライブラリを使ってOracle Database 18.3と接続している場合のみ、最新のすばらしい一連のOracle Databaseの機能を利用できます。
node-oracledb 3.0でのトピックをご紹介しましょう。
  • Oracle Simple Document Access (SODA) のサポート:標準のリレーショナルアクセスモデルに加わったのが、Oracle SODAの新しいAPIです。例を使って後で説明します。
  • pool.close() の新しい引数drainTimeを使うと、指定した秒数が経過したらプールを強制的にクローズできます。この機能はDanilo Silvaの貢献によるものです。
    pool.close()
    https://github.com/oracle/node-oracledb/blob/master/doc/api.md#poolclose
    プールを指定したdrainTimeでクローズすると、後続のgetConnection()の呼び出しは失敗しますが、現在利用している接続は引き続き機能し続けます。これにより、コードの完了と未解決のトランザクションのコミットが可能になります。接続が使用されていない場合、またはドレイン時間到達時のいずれか最初に発生したタイミングで、プールとすべての接続を強制的にクローズします。

    「強制的にクローズ」という言葉は厳しく思われますが、実際には、ユーザーは接続プールがクローズ中、もしくはすでにクローズされているという明確なメッセージを得るため、ドレーン時間によってアプリケーションの正常終了が可能ですし、タイムアウトを待たずにデータベース側のセッションをきれいに解放することができます。drainTimeはゼロにすることもできるので、すべてのセッションを即座に終了できます。これは、データベースにとって都合よいようにアプリケーションを終了したいときに便利です。
  • 事前構築済みのnode-oracledbバイナリのインストールは、基本的なプロキシ認証のサポートによって少し楽になりました。また、プロキシ環境変数が設定されていない場合、インストール時に 'npm config'プロキシ値を使用するようになりました。これらの変更はCemre Menguの貢献によるものです。
  • 長時間実行されているデータベース呼び出しを中断するconnection.callTimeoutプロパティを追加しました。これは、Oracle Databaseのバージョンに関係なく、node-oracledb 3とOracle Clientライブラリのバージョン18.1以降を組み合わせて使用している場合に使用できます。
    connection.callTimeout
    https://oracle.github.io/node-oracledb/doc/api.html#propconncalltimeout
    呼び出しタイムアウトは制御不能なSQLやPL/SQL文の実行を防止する上で有用なものです。背景として、node-oracledbの実行の下にあるメインコード層はOracle Call Interfaceで、このAPIはOracle Databaseへの全てのネットワーク接続を処理します。node-oracledbが各OCI関数を呼び出すと、ゼロ回以上のDatabaseとのやりとり、つまりデータベースの呼び出しと戻ってくるレスポンスの取得というが発生します。

    callTimeout値は、各ラウンドトリップに個別に適用され、すべてのラウンドトリップの合計に適用されるわけではありません。各ラウンドトリップの完了前または終了後のnode-oracledbでの処理時間は対象外です。
    • とある1回のラウンドトリップの開始から、当該ラウンドトリップの完了までの時間がcallTimeoutミリ秒を超える場合、オペレーションを停止して、エラーを返します。
    • node-oracleledbのオペレーションで複数回のラウンドトリップが必要で、各ラウンドトリップがcallTimeoutミリ秒より短い時間の場合、すべてのラウンドトリップの合計がcallTimeoutを超えていても、タイムアウトは発生しません。
    • ラウンドトリップの必要がない場合、オペレーションは中断されません。
    callTimeoutミリ秒を超過すると、node-oracledbは内部接続状態をクリーンアップしようとします。このクリーンアップには、別のcallTimeoutミリ秒が適用されます。
  • クリーンアップが成功した場合、以下のエラーメッセージが返りますが、アプリケーションは引き続き接続を利用できます。
    "DPI-1067: call timeout of N ms exceeded with ORA-XXX"
    callTimeoutの値が小さい場合、追加のcallTimeout期間内に接続のクリーンアップが正常に完了しないことがあります。 この場合、ORA-3114が戻され、接続は使用できなくなり、接続を閉じる必要があります。
  • Windowsの場合、node-oracledbは、まず 'node_modules\oracledb\build\Release' ディレクトリからOracle Clientライブラリをロードしようとします。その後、標準のWindowsライブラリディレクトリ検索、つまり環境変数PATHで定義されたディレクトリからロードしようとします。

    この新機能は、Windowsにアプリケーションをバンドルし、Oracle Instant Clientを含める場合に便利です。つまり、クライアントライブラリを 'node_modules\oracledb\build\Release' ディレクトリに置くことでPATHの設定が不要になり、PATHを変更するユーザーを心配する必要がなくなり、PATHに複数のバージョンのOracle Clientライブラリがあっても心配する必要がないからです。
  • poolPingInterval機能は、Oracle Clientライブラリ12.2以降で接続プールを使用している場合に「再有効化」されています。ネットワークが切断されたかどうかを確認するのにOracle Clientの内部チェックが非常に効率的ゆえ、以前はこれらのバージョンでは意図的に有効になっていませんでした。しかし、データベース・セッション・リソース制限(例えば、使用時にORA-02396が返される)を超えたり、DBAによって明示的にクローズ(たとえば、ORA-00028が返される)されたりしたために利用不可になった接続は、内部チェックでは識別できません。ここで、poolPingIntervalが役に立ちます。
    oracledb.poolPingInterval
    https://oracle.github.io/node-oracledb/doc/api.html#propdbpoolpinginterval
    この変更により、アプリの可用性は高まるように見えますが、欠点もあります。アプリが黙って再接続している可能性がありますし、大きなプールを再構築する必要がある場合は、接続ストームに気付かない可能性があります。AWRレポートをチェックして接続が頻繁に発生しているかどうかを監視し、アイドル・セッションを終了しないようにネットワークおよびDBA管理者と協力して作業する必要があります。
その他の変更や機能改善は変更履歴をご覧ください。
Change Log
https://github.com/oracle/node-oracledb/blob/master/CHANGELOG.md
といいつつ、SODAについて説明をしますので、是非この後もお読みください。

Simple Oracle Document Access (SODA) in node-oracledb

Oracle Simple Document Access(SODA)はNoSQLスタイルのAPIのセットで、SQLを知らなくても、Oracle Databaseにドキュメント(特にJSON)のコレクションを作成および格納したり、取得や問合せを実行できます。Oracle Database 18.3およびOracle Client 18.3以上を使用している場合、node-oracledb 3でSODAサポートを利用できます。SODA APIは、Python、C、Java、PL/SQL、RESTで利用できるため、幅広くアクセスできるため、きっとお手元のデータツールキットの中でも有用なツールとなることでしょう。現在、node-oracledb 3 SODA APIは「プレビュー」扱いですが、Oracle Clientライブラリの将来のバージョンで変更される予定です。
node-oracledbのクラス図から、リレーショナルの世界とSODAの世界の分離がわかると思います。

現実には、SODAはOracle Databaseの表に基づいているので、セキュアで効率的なストレージ・ソリューションを提供します。これらの表にはSQLでアクセスできますが、ほとんどその必要はありません。それが必要なのは、レポート作成のための分析などの高度なOracle Database機能を使う場合だけでしょう。
代わりに、新しいクラスとメソッドを使います。DBAがSODA_APP権限を付与すると、その中にコレクションを作成したり、ドキュメント(JSONなど)を格納したりできます。いくつかの基本的なサンプルをご紹介します。
// Create the parent object for SODA.
soda = await connection.getSodaDatabase();

// Create a new SODA collection, if it doesn't exist.
// This will open an existing collection, if the name is already in use.
collection = await soda.createCollection("mycollection");

// Insert a document.
// A system generated key is created by default.
content = {name: "Matilda", address: {city: "Melbourne"}};
doc = await collection.insertOneAndGet(content);
key = doc.key;
console.log("The key of the new SODA document is: ", key);
キー・ルックアップや検索を使ってドキュメントを取得できます。キー・ルックアップは簡単です。
// Fetch the document back
doc = await collection.find().key(key).getOne(); // A SodaDocument
content = doc.getContent();                      // A JavaScript object
console.log('Retrieved SODA document as an object:');
console.log(content);
JSONに変換可能なドキュメントの場合、文字列として取得できます。
content = doc.getContentAsString();              // A JSON string
console.log('Retrieved SODA document as a string:');
console.log(content);
メソッドfind()はオペレーション・ビルダで順々に制限基準を設定できるので、一連のドキュメントの個数を減らした後に、getOne()getDocuments()count()などの終端メソッドが作用します。
JSONドキュメントでは、完全なフィルタリング仕様言語を使用してQBE(Query-by-Example)でドキュメントを検索できます。 以下は簡単な例です。
// Find all documents with city names starting with 'S'
documents = await collection.find()
  .filter({"address.city": {"$like": "S%"}})
  .getDocuments();

for (let i = 0; i < documents.length; i++) {
  content = documents[i].getContent();
  console.log('  city is: ', content.address.city);
}
実行可能なサンプルはsoda1.jsにあります。
soda1.js
https://github.com/oracle/node-oracledb/tree/master/examples/soda1.js#L34
node-oracledbのマニュアルのSODAのセクションとIntroduction to Simple Oracle Document Access(SODA)のマニュアルで、そのパワーとシンプルさを確認してください。
Simple Oracle Document Access (SODA)
https://oracle.github.io/node-oracledb/doc/api.html#sodaoverview
Oracle® Database Simple Oracle Document Access (SODA)の概要 18c
SODAの概要
https://docs.oracle.com/cd/E96517_01/adsdi/overview-soda.html#GUID-BE42F8D3-B86B-43B4-B2A3-5760A4DF79FBOracle® Database Introduction to Simple Oracle Document Access (SODA) 18c
Overview of SODA
https://www.oracle.com/pls/topic/lookup?ctx=dblatest&id=GUID-BE42F8D3-B86B-43B4-B2A3-5760A4DF79FB
まだOracle Database 18.3の環境をお持ちではありませんか?なら、こちらからどうぞ。
Oracle Database Software Downloads
https://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html
もしくは旧バージョンのOracle DatabaseでのJSONの利用にご興味があれば、こちらをどうぞ。
So you want to use JSON in Oracle Database with Node.js?
https://blogs.oracle.com/opal/so-you-want-to-use-json-in-oracle-database-with-nodejs

Summary

あなたの開発体験をより良いものにするために、node-oracledbに重要な機能を引き続き導入していきます。Wishlistにたくさん詰まっているため、引き続き作業を続けます。コミュニティからの貢献ははいつでも歓迎します。そして、node-oracledbの今リリースおよび以前のリリースの改善を手助けしてくれた方々に感謝いたします。

Resources