21.2.19での変更点
トピック
新機能
- オフヒープ・キャッシュは、Oracle NoSQL Databaseで使用されなくなりました。オフヒープ・キャッシュでは、期待したパフォーマンス上のメリットが得られず、パフォーマンスに悪影響を及ぼす場合があるため、削除されました。
この変更の一部として、オフヒープ・キャッシュのサイズを構成するために以前に使用された
systemPercent
パラメータは廃止されました。パラメータは引き続き指定できますが、無視されます。メモリーがオフヒープ・キャッシュに割り当てられた構成を持つストアでは、そのメモリーがシステム・バッファ・プール内のファイル・システム・キャッシュに使用できるようになりました。つまり、オフヒープ・キャッシュに保存されていたデータは、システム・バッファ・プールにキャッシュされます。
[KVSTORE-927]
- 配列およびマップのネスト解除を実装しました。
FROM句が拡張されて、問合せで参照される表の後に式のリストが使用できるようになりました。概念的には、表の行ごとに式が評価され、現在の行とこれらの評価の結果によってクロス積が生成されます。FROM句全体の結果は、これらのすべてのクロス積の結合を含む表です。
FROM句には任意のタイプの式が表示される場合がありますが、この機能の主な目的は、表の行に表示される配列(またはマップ)をネスト解除することです。ネストをサポートする主な理由は、配列またはマップに含まれているフィールド別にグループ化することです。例として、TVストリーミング・サービスからのデータを格納する次の表を考えてみます。create table stream_acct(acct_id integer, value json, primary key(acct_id))
この表のサンプル行は次のようになります。{ "acct_id": 1, "value": { "firstName" : "John", "lastName" : "Sanders", "country" : "USA", "contentStreamed": [ { "showName": "Call My Agent", "showId": 15, "showType": "tvseries", "numSeasons" : 2, "seriesInfo": [ { "seasonNum" : 1, "numEpisodes" : 2, "episodes": [ { "episodeID" : 20, "lengthMin" : 45, "minWatched" : 45 }, { "episodeID" : 30, "lengthMin" : 42, "minWatched" : 42 } ] }, { "seasonNum": 2, "numEpisodes" : 2, "episodes": [ { "episodeID" : 20, "lengthMin" : 50, "minWatched" : 50 }, { "episodeID" : 30, "lengthMin" : 46, "minWatched" : 46 } ] } ] }, { "showName": "Rita", "showId": 16, "showType": "tvseries", "numSeasons" : 1, "seriesInfo": [ { "seasonNum" : 1, "numEpisodes" : 2, "episodes": [ { "episodeID" : 20, "lengthMin" : 65, "minWatched" : 65 }, { "episodeID" : 30, "lengthMin" : 60, "minWatched" : 60 } ] } ] } ] } }
次の問合せでは、「人気」(興味を示したユーザーの数)に従って、米国のショーが並べ替えられます。select $show.showId, count(*) as cnt from stream_acct $s, unnest($s.value.contentStreamed[] as $show) where $s.value.country = "USA" group by $show.showId order by count(*) desc
前述の問合せは、次の索引が作成されている場合に最適化できます。create index idx_country_showid on stream_acct( value.country as string, value.contentStreamed[].showId as integer) with unique keys per row
問合せではこの索引が使用されます。国の条件は索引にプッシュされ、グループ化は索引ベースになり、索引はこの問合せの対象となります。索引を使用する場合、行ごとに抽出される索引キーに重複を含めることはできません。この制約は、索引を「行ごとの一意のキー」として作成することで適用されます。
前述の(および一般的な)問合せ内のunnest句は厳密には必要ではありません。問合せのセマンティクス(および結果)を変更せずに省略できます。ただし、省略した場合、索引は使用されません。これは、unnest句がラップする式の種類に制限を設けるためであり、これらの制限により、問合せプロセッサは、ネスト解除する配列/マップに対する索引が適用可能であることを検出し、それに応じて問合せを再作成できるようになります。
[KVSTORE-822]
seq_distinct()
関数が追加されました。入力式によって生成されたシーケンスの個別値が返されます。たとえば、次の問合せでは、市外局番に電話番号があるユーザーの数が市外局番ごとに返されます。問合せでseq_distinct()が使用されるのは、ユーザーが同じ市外局番に複数の電話番号を持っている場合があるが、市外局番ごとに1回のみカウントする必要があるためです。select $areacode, count(*) as cnt from Users u, seq_distinct(u.address.phones[].areacode) as $areacode group by $areacode
[KVSTORE-822]
- 比較演算子では、一方のオペランドがタイムスタンプで、もう一方のオペランドが文字列である場合、文字列オペランドはタイムスタンプ・オペランドの精度と同じ精度を持つタイムスタンプに暗黙的にキャストされます。キャストが失敗すると、例外がスローされます。
[KVSTORE-1016]
- ネストされたseq_transform()式のサポートが強化されました。
seq_transform()
は、表の行に格納されているJSONドキュメントの変換に役立ちます。このような状況では、複数のseq_transform()
式を相互にネストして使用する必要があることがよくあります。また、内部seq_transform()
式は、外部seq_transform()
式の「現在の」入力アイテムにアクセスすることが必要になる場合があります。これまでは不可能でした。このリリースでは、このような式ごとに、内部のseq_transform()
式で参照できる適切な名前のコンテキストアイテム変数を作成するように、seq_transform()
が拡張されました。たとえば、航空旅行荷物に関する情報を記録する次の表を考えてみます。create table luggage ( ticketNo string, passengerName string, bagInfo json, primary key(ticketNo))
この表のサンプル行を次に示します{ "ticketNo" : "1762352483606", "passengerName" : "Willie Hernandez", "bagInfo" : [ { "tagNum" : "17657806243915", "routing" : "SFO/AMS/HER", "lastActionCode" : "offload", "lastSeenStation" : "HER", "lastSeenTimeGmt" : "2019-03-13T15:19:00", "flightLegs" : [ { "flightNo" : "BM604", "flightDate" : "2019-03-12T20:00:00", "fltRouteSrc" : "SFO", "fltRouteDest" : "AMS", "estimatedArrival" : "2019-03-13T08:00:00", "actions" : [ { "at":"SFO", "action":"TagScan", "time":"2019-03-12T18:14:00" }, { "at":"SFO", "action":"onload", "time":"2019-03-12T19:20:00" }, { "at":"AMS", "action":"offload", "time":"2019-03-13T08:30:00" } ] }, { "flightNo" : "BM667", "flightDate" : "2019-03-13T11:14:00", "fltRouteSrc" : "AMS", "fltRouteDest" : "HER", "estimatedArrival" : "2019-03-13T15:00:00", "actions" : [ { "at":"AMS", "action":"TagScan", "time":"2019-03-13T10:45:00" }, { "at":"AMS", "action":"onload", "time":"2019-03-13T10:50:00" }, { "at":"HER", "action":"offload", "time":"2019-03-13T15:19:00" } ] } ] }, { "tagNum" : "17657806244523", "routing" : "SFO/AMS/HER", "lastActionCode" : "offload", "lastSeenStation" : "AMS", "lastSeenTimeGmt" : "2019-03-13T08:35:00", "flightLegs" : [ { "flightNo" : "BM604", "flightDate" : "2019-03-12T20:00:00", "fltRouteSrc" : "SFO", "fltRouteDest" : "AMS", "estimatedArrival" : "2019-03-13T08:00:00", "actions" : [ { "at":"SFO", "action":"TagScan", "time":"2019-03-12T18:14:00" }, { "at":"SFO", "action":"onload", "time":"2019-03-12T19:22:00" }, { "at":"AMS", "action":"offload", "time":"2019-03-13T08:32:00" } ] } ] } ] }
ticketNoごとに、そのticketNoの荷物に対して実行されたすべてのアクションを含むフラット配列を返す問合せを作成するとします。ただし、各アクションの"at"フィールドと"action"フィールドのみが必要です。さらに、各アクションにflightNoおよびtagNumフィールドを含めます。具体的に言うと、前述のサンプル行の結果は次のようになります。{ "actions" : [ {"at":"SFO", "action":"TagScan", "flightNo":"BM604", "tagNum":17657806243915}, {"at":"SFO", "action":"onload", "flightNo":"BM604", "tagNum":17657806243915}, {"at":"AMS", "action":"offload", "flightNo":"BM604", "tagNum":17657806243915}, {"at":"AMS", "action":"TagScan", "flightNo":"BM667", "tagNum":17657806243915}, {"at":"AMS", "action":"onload", "flightNo":"BM667", "tagNum":17657806243915}, {"at":"HER", "action":"offload", "flightNo":"BM667", "tagNum":17657806243915}, {"at":"SFO", "action":"TagScan", "flightNo":"BM604", "tagNum":17657806244523}, {"at":"SFO", "action":"onload", "flightNo":"BM604", "tagNum":17657806244523}, {"at":"AMS", "action":"offload", "flightNo":"BM604", "tagNum":17657806244523}, ] }
前述の結果を返す問合せを次に示します。select seq_transform( l.bagInfo[], seq_transform( $sq1.flightLegs[], seq_transform( $sq2.actions[], { "at" : $sq3.at, "action" : $sq3.action, "flightNo" : $sq2.flightNo, "tagNum" : $sq1.tagNum } ) ) ) as actions from luggage l
この問合せでは、
$sq1
はbagInfo配列の要素を反復し、$sq2
はflightLegs配列の要素を反復し、$sq3
はactions配列の要素を反復します。[KVSTORE-1044]
バグとパフォーマンスの修正
NodeMetrics.getAverageLatencyNanos
メソッドが常に10000を返すKVStatsの問題が修正されました。[KVSTORE-996]
- RNのJVMバイアス・ロックが無効になりました。現在、-XX:-UseBiasedLockingはRNのJVMコマンドラインに明示的に渡されます。この変更により、RNでレイテンシがさらに予測可能になりました。この変更によるパフォーマンスの低下はありません。
[KVSTORE-1047]
- デフォルトのパーティション移行の同時実行性が向上しました。パーティションの移行は、再配分やバランス再調整などのトポロジの変更中に行われます。パーティション移行を同時に実行する数を制限する2つのパラメータがあります。これらのパラメータのデフォルト値が大きくなりました。具体的には、次のとおりです。
rnPMConcurrentSourceLimit
- デフォルトが1から2に変更されましたrnPMConcurrentTargetLimit
- デフォルトが2から4に変更されました
同時実行性のレベルが高い場合、トポロジの変更の完了にかかる全体の時間が短縮されることが多くなります。この値が大きくなったことにより、特にSSDを使用する場合、トポロジの変更中に継続するデータ操作に悪影響を与えることはありません。ディスクが回転している古いハードウェアでストアが実行されている場合、ユーザーはパラメータを元のデフォルト値に明示的に設定できます。
[KVSTORE-1002]
- 管理CLIコマンド
ping
およびverify configuration
の出力には、サービス開始時間および状態変更時間に関する情報が含まれるようになりました。[KVSTORE-876]
- 直接JavaドライバでのJava RMIの使用がオプションになりました。ドライバは、21.2リリースより前のソフトウェアを実行しているサーバーにアクセスする場合、または
KVStoreConfig.setUseAsync(false)
をコールして非同期ネットワーク・プロトコルの使用を無効にするようにドライバが構成されている場合のみ、RMIを使用します。非同期ネットワーク・プロトコルは、同じソケット接続での同時コールをサポートするため、この変更により、特に多数のシャードを持つストアではソケットやその他のリソースの使用量が削減される場合があります。[KVSTORE-340]
haHostname
およびhaPortRange
ストレージ・ノード・パラメータが読取り専用になりました。これらのパラメータを変更しても、影響はありません。新しい動作は、パラメータが変更されないようにするためのものです。新しいJE HAパラメータに切り替える唯一の方法は、新しいストレージ・ノードに移行することです。[KVSTORE-437]
- kvliteコマンドには新しいフラグがあります。これにより、ユーザーは新しいkvliteストア
-storagedirsizegb size_in_GB
に関連付けられたストレージ・サイズを制御できるようになります。デフォルト値は10GBで、前の1GBのデフォルトから変更されています。このフラグはストアの初期作成にのみ適用され、既存のストア上でkvliteが起動されるときに無視されます。
また、既存のストアで開始されたkvliteの出力が、既存のストアの値を適切に反映するようになりました。
[KVSTORE-1042]
StringDef.equals()
メソッドは、2つのフィールドが等しいかどうかを判断するときにサブタイプを考慮するようになりました。タイプ"STRING"
、"STRING AS UUID"
および"STRING AS UUID GENERATED BY DEFAULT"
は等しくなくなりました。[KVSTORE-1048]
verify configuration
管理CLIコマンドが変更され、バージョンの違いが違反ではなくノートとして報告されるようになりました。アップグレード時にはバージョンの違いが想定されるため、違反とはみなされません。verify configuration
およびping
管理CLIコマンドの非JSONの出力形式が変更され、出力のキーワードの最後に表示されるコロン・セパレータの後に空白が追加され、読みやすくなりました。また、いくつかのキーワードから空白が削除され、"available storage size"が"availableStorageSize"に、"storage type"が"storageType"に変更されました。ログインの問題に関連する管理CLIコマンドの非JSONの出力形式が変更され、出力に一貫性が確保されるようになりました。
[KVSTORE-448]
- 管理CLIの
plan deploy-topology
コマンドが変更され、デプロイされる新しいトポロジで、未処理のトポロジ違反の数(ある場合)を増えないようにするだけでなく、減らすことが必要になりました。以前と同様に、コマンドは、-forceフラグを指定して新しいトポロジを強制的にデプロイできます。また、場合によっては不正確であったコマンドによるトポロジ違反のカウント方法の問題も修正されました。これら2つの変更によって、十分なSNを提供せずに新しいゾーンをデプロイしたり、ストレージ・ディレクトリ・サイズが十分でないゾーンを提供したりすると、トポロジのデプロイメントは、新しいゾーンへの移入に必要な変更を実際に行わずに成功する場合があるという問題が修正されました。
[KVSTORE-542]
- デフォルトのTLSプロトコル設定からTLSv1およびTLSv1.1が削除されました。デフォルトでは、このリリース以降はTLSv1.2のみを使用して新しいセキュリティ構成が作成されます。
[KVSTORE-903]
- データ消去を制御するために、2つの新しいレプリケーション・ノード・パラメータ'enableErasure'および'erasurePeriod'が追加されました。
'enableErasure'がtrueに設定されている場合、基礎となるBDB JEストレージ・レイヤーの消去機能が有効になります。消去では、対応するレコードをゼロにして、ストレージ・レイヤーから廃止されたデータを定期的に消去します。デフォルト値はfalseです。表およびキー/値データのみが消去されることに注意してください。表メタデータは消去の対象ではありません。
消去が有効になっている場合、'erasurePeriod'パラメータに指定された値は、1回の完全消去でデータを処理する期間を指定します。消去はこの値に基づいて調整され、パフォーマンスへの影響が最小限に抑えられます。デフォルトでは、"6 DAYS"に設定されています。
[KVSTORE-1033]
- BigDataSQL問合せの一部でNullPointerExceptionが発生する問題が修正されました。この問題は、次のようなスタック・トレースの特徴があります。
Caused by: java.lang.NullPointerException at java.util.Objects.requireNonNull(Objects.java:203) at java.util.AbstractCollection.retainAll(AbstractCollection.java:405) at oracle.kv.impl.query.runtime.RuntimeControlBlock.setPartitionSet(RuntimeControlBlock.java:258) at oracle.kv.impl.query.runtime.ReceiveIter.open(ReceiveIter.java:1252) at oracle.kv.impl.api.query.QueryStatementResultImpl$QueryResultIterator.<init>(QueryStatementResultImpl.java:297) at oracle.kv.impl.api.query.QueryStatementResultImpl.<init>(QueryStatementResultImpl.java:153) at oracle.kv.impl.api.query.QueryStatementResultImpl.<init>(QueryStatementResultImpl.java:115) at oracle.kv.impl.api.query.PreparedStatementImpl.executeSyncPartitions(PreparedStatementImpl.java:365) at oracle.kv.impl.api.KVStoreImpl.executeSyncPartitions(KVStoreImpl.java:3635) at oracle.kv.hadoop.table.TableRecordReaderBase.getNextOnqlIteratorPartitions(TableRecordReaderBase.java:523) at oracle.kv.hadoop.table.TableRecordReaderBase.getNextIterator(TableRecordReaderBase.java:500) at oracle.kv.hadoop.table.TableRecordReaderBase.nextKeyValue(TableRecordReaderBase.java:391) ... 11 more
このリリースでは、前述の問題は修正されており、発生しなくなりました。
[KVSTORE-1123]
- シャード上にストリームAPIのサブスクリプションが複数ある場合、表の追加や削除など、サブスクリプション上の表を変更すると、他のサブスクリプションに対しても表に同じ変更が発生するという問題が修正されました。
[KVSTORE-35]
- SSLDataChannelに関連するデッドロックの問題が修正されました。この問題により、スレッド・ダンプで次のようなスタック・トレースが生成されます。
"ReplicaOutputThread" #829 daemon prio=5 os_prio=0 cpu=8695.34ms elapsed=66577.11s tid=0x000055f030c1f800 nid=0x49f2 waiting for monitor entry [0x00007fc720171000] java.lang.Thread.State: BLOCKED (on object monitor) at com.sleepycat.je.rep.utilint.net.SSLDataChannel$ChannelWriteTask.run(SSLDataChannel.java:1425) - waiting to lock <0x00000010046df7e0> (a java.nio.HeapByteBuffer) at com.sleepycat.je.rep.utilint.net.SSLDataChannel$ChannelWriteTask.access$1100(SSLDataChannel.java:1413) at com.sleepycat.je.rep.utilint.net.SSLDataChannel.flush(SSLDataChannel.java:590) ...... "REPLICA rg15-rn2(2)" #68 daemon prio=5 os_prio=0 cpu=9106.65ms elapsed=68622.76s tid=0x000055f030c55800 nid=0xb24 in Object.wait() [0x00007fc722b93000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(java.base@11.0.8/Native Method) - waiting on <no object reference available> at java.lang.Object.wait(java.base@11.0.8/Object.java:328) at com.sleepycat.je.rep.utilint.net.SSLDataChannel$ChannelTask.transitToInProgress(SSLDataChannel.java:1335) - waiting to re-lock in wait() <0x00000010046e01b8> (a java.lang.Object) at com.sleepycat.je.rep.utilint.net.SSLDataChannel$ChannelWriteTask.run(SSLDataChannel.java:1423) at com.sleepycat.je.rep.utilint.net.SSLDataChannel$ChannelWriteTask.access$1100(SSLDataChannel.java:1413) at com.sleepycat.je.rep.utilint.net.SSLDataChannel.doWrap(SSLDataChannel.java:910) - locked <0x00000010046df7e0> (a java.nio.HeapByteBuffer) at com.sleepycat.je.rep.utilint.net.SSLDataChannel.handshake(SSLDataChannel.java:847) at com.sleepycat.je.rep.utilint.net.SSLDataChannel.unwrap(SSLDataChannel.java:771) at com.sleepycat.je.rep.utilint.net.SSLDataChannel.read(SSLDataChannel.java:403) ......
[KVSTORE-1021]
- SSLDataChannelに関連するライブロックの問題が修正されました。この問題は、SSLDataChannel doWrapまたはdoUnwrapの非アクティブなチャネルとして発生します。次のようなスタック・トレースがスレッド・ダンプに表示されます。
java.lang.Thread.State: RUNNABLE at java.lang.Object.hashCode(java.base@11.0.6/Native Method) at java.util.concurrent.ConcurrentHashMap.replaceNode(java.base@11.0.6/ConcurrentHashMap.java:1111) at java.util.concurrent.ConcurrentHashMap.remove(java.base@11.0.6/ConcurrentHashMap.java:1102) at com.sleepycat.je.utilint.LoggerUtils.logMsg(LoggerUtils.java:538) at com.sleepycat.je.utilint.LoggerUtils.logMsg(LoggerUtils.java:445) at com.sleepycat.je.rep.utilint.net.DataChannelFactoryBuilder$ChannelInstanceLogger.log(DataChannelFactoryBuilder.java:417) at com.sleepycat.je.rep.utilint.net.SSLDataChannel$ChannelWriteTask.run(SSLDataChannel.java:1636) - locked <0x00000000f037cc80> (a java.lang.Object) at com.sleepycat.je.rep.utilint.net.SSLDataChannel$ChannelWriteTask.access$1400(SSLDataChannel.java:1613) at com.sleepycat.je.rep.utilint.net.SSLDataChannel.doWrap(SSLDataChannel.java:990) ...... java.lang.Thread.State: RUNNABLE at java.lang.Object.notifyAll(java.base@11.0.6/Native Method) at com.sleepycat.je.rep.utilint.net.SSLDataChannel$ChannelTask.transitToIdle(SSLDataChannel.java:1513) - locked <0x00000000f039e788> (a java.lang.Object) at com.sleepycat.je.rep.utilint.net.SSLDataChannel$ChannelReadTask.run(SSLDataChannel.java:1808) at com.sleepycat.je.rep.utilint.net.SSLDataChannel$ChannelReadTask.access$1800(SSLDataChannel.java:1751) at com.sleepycat.je.rep.utilint.net.SSLDataChannel.readChannelForBufUnderflow(SSLDataChannel.java:1168) at com.sleepycat.je.rep.utilint.net.SSLDataChannel.doUnwrap(SSLDataChannel.java:1079) - locked <0x00000000f0386f20> (a java.lang.Object) - locked <0x00000000f0386ea8> (a java.lang.Object) at com.sleepycat.je.rep.utilint.net.SSLDataChannel.handshake(SSLDataChannel.java:930) at com.sleepycat.je.rep.utilint.net.SSLDataChannel.unwrap(SSLDataChannel.java:828) at com.sleepycat.je.rep.utilint.net.SSLDataChannel.read(SSLDataChannel.java:441) ......
[KVSTORE-1022]
- 一時的なネットワークの問題が発生したときにInternalFaultExceptionが捕捉されないために、StorageNodeのRepNodeまたはMasterRebalanceThreadが予期せず終了する問題が修正されました。この場合、これらの両方がSessionAccessExceptionのために終了したことが、ロギング出力に表示されますが、これは正しくないため、修正されました。
2021-02-12 10:16:26.575 UTC SEVERE [sn6] MasterRebalanceThread thread exiting due to exception. oracle.kv.impl.security.SessionAccessException: java.rmi.ConnectIOException: Exception creating connection to: ... 2021-02-12 10:16:26.575 UTC SEVERE [sn6] MasterRebalanceThread thread exiting due to exception. oracle.kv.impl.security.SessionAccessException: java.rmi.ConnectIOException: Exception creating connection to: ...
[KVSTORE-942]
- ネームスペース内の既存の表も削除されるが、そのデータはストア内に残る
DROP NAMESPACE
コマンドのバグが修正されました。表が削除されたため、データにアクセスしたり削除したりすることはできません。[KVSTORE-1076]
- REMOVE句とともにUPDATE文を使用してARRAY(RECORD)またはMAP(RECORD)から要素を削除すると、java.lang.IllegalArgumentExceptionの「Error: at (...) Cannot remove fields from records.」で失敗するバグが修正されました。
[KVSTORE-1200]
パッケージの変更点
- kvclient.jarおよびkvstore.jarのパッケージは、パブリックMavenリポジトリで使用できず、以前にディストリビューションに個別のJARファイルとして含まれていたOracle内部ライブラリのクラスを含めるように変更されました。この変更は、JARファイルには現在、公開されている依存関係があるため、kvclient.jarに依存するMaven pom.xmlファイルの作成および使用を容易にするためのものです。含まれているライブラリは次のとおりです。
- commonutil.jar
- sklogger.jar
- sdoapi.jar
- sdoutl.jar
- sdodep3prt.jar
また、kvstore-ee.jarによって参照されるEnterprise Edition専用のライブラリのクラスが、そのライブラリに直接含まれるようになり、依存関係の処理が簡単になります。含まれるライブラリは、Oracle Walletに関連付けられたライブラリです。- osdt_core.jar
- osdt_cert.jar
- osraclepki.jar
また、現在はソースから完全に構築できないため、XMLビルド・ファイルがCommunity Editionリリースから削除されています。
[KVSTORE-1100]