ThingWorx トランザクションについて
ThingWorx 9.3.2 以降では、サービスの作成に次の変更が導入されました。
データベース操作のカテゴリ
ThingWorx Platform では、データベース操作は次の 3 つのカテゴリに分類されます。
• 常にバッチ処理されるプロパティ書き込みなどのデータ書き込み操作。
• ThingWorx 9.3.2 でアップデートされたデータ読み取り操作。これにより、トランザクションが同期的に解放されます。
• トランザクションを取得し、トップレベルのサービスが終了するまでトランザクションを保持するモデル操作。
データベースを処理するすべての操作が同期的に実行されるわけではなく、すぐに接続が使用されるわけではないため、モデル操作がデータベース操作の代わりに推奨されます。
モデル操作は、システムエンティティに影響を与えます。たとえば、以下のようなものがあります。
• プロパティ定義の変更: ベースタイプの追加、除去、変更など。
• コンフィギュレーションの変更。
データ操作は非同期で実行されるデータベース操作であり、効率を高めるバッチ処理が行われる可能性があります。たとえば、以下のようなものがあります。
• プロパティ値の更新 (永続の場合も含む)。
• データテーブル、ストリーム、または値ストリームへのエントリの追加。
同期的なトランザクションを使用するプラットフォームサービス
このセクションでは、トランザクションを同期的に解放する ThingWorx Platform サービスについて説明します。
• DataTableThing
◦ GetDataTableEntries
◦ GetDataTableEntryByKey
◦ GetDataTableEntryCount
◦ FindDataTableEntries
◦ QueryDataTableEntries
◦ SearchDataTableEntries
• "Stream" ThingTemplate を使用する Thing
◦ GetStreamEntryCount
◦ QueryStreamData
◦ QueryStreamEntries
◦ QueryStreamEntriesWithData
◦ GetStreamEntry
• ValueStream または RemoteValueStream ThingTemplate を使用する Thing
◦ Get<Type>StreamEntry
▪ Integer、Long、Number、Boolean、Location、String、Vec2、Vec3、Vec4、ThingCode、InfoTable、Image、DateTime
◦ Query<Type>StreamEntries
▪ Integer、Long、Number、Boolean、Location、String、Vec2、Vec3、Vec4、ThingCode、InfoTable、Image、DateTime
◦ QueryMultiPropertyStreamEntries
また、プロパティを ValueStream にログする Thing は、これらの API を使用してストリームをクエリーできます。
サービスの作成の最良事例
このセクションでは、サービスがいくつかの一般的なガイドラインに従っている場合にのみ、特定の状況でデータベース接続を使用可能な状態で維持するための最良事例について説明します。これらの最良事例には以下が含まれます。
• モデル変更前にクエリー操作を実行する
• モデル変更後に実行される長時間の作業を最小化する
接続が使用されていないときの長時間の作業の実行
モデル操作を実行するための接続が取得されると、サービスが終了するまでリリースできません。モデル操作の前にクエリー操作を実行すると、クエリーのための接続を取得してから、後でほかの作業が行われている間にリリースできます。モデルに影響を与える長時間の作業がある場合は、接続が使用中になる前に、その作業を最初に実行するようにしてください。
varthing = Things["SomeThing"];
// Instead of
thing.AddPropertyDefinition();// connection acquired
varhistory = thing.QueryPropertyHistory();
vardata = makeSomeExternalCalls(history);// connection held here
varvalue = calculateValue(data);// and here
thing.SetPropertyValue(value);
// Do this
varhistory = thing.QueryPropertyHistory();// connection acquired & released
vardata = makeSomeExternalCalls(history);// no connection
varvalue = calculateValue(data);// nor here
thing.AddPropertyDefinition();// connection acquired
thing.SetPropertyValue(value);
非同期サービスの使用
モデルが変更された後に長時間のタスクを実行できない場合、非同期サービスを使用できます。非同期サービスでは、応答を待たずに次のコマンドに移動するため、接続の競合を緩和できます。使用される処理リソースの数は減りませんが、サービスの応答性が向上します。非同期サービスは、値を直接返すことができないので、実用的でないこともありますが、効率的にリソースを使用するために役立ちます。
varthing = Things["SomeThing"];
thing.AddPropertyDefinition();// connection acquired
asyncDoHttpRequestAndUpdateProperty(property);// request handled in another thread
// connection released (before async call completes)
モデル操作とは
このドキュメントでは、データベース操作の代わりにモデル操作が参照されています。それは、データベースを処理するすべての操作が同期的に実行されるわけではなく、すぐに接続が使用されるわけではないからです。
モデル操作は、システムエンティティのデータではなく、システムエンティティに影響を与えます。以下のような例があります。
• プロパティ定義の変更: ベースタイプの追加、除去、変更など
• コンフィギュレーションの変更
効率を上げるために、複数のデータベース操作が非同期で実行され、場合によってはグループごとに整理されます。一般的には、次のようなデータ操作が含まれます。
• プロパティ値の更新 (永続の場合も含む)。
• データテーブル、ストリーム、または値ストリームへのエントリの追加。