了解 ThingWorx 事务处理
在 ThingWorx 9.3.2 中,针对服务创作引入了以下更改。
数据库操作的类别
在 ThingWorx Platform 中,数据库操作分为三类:
数据写入操作(如属性写入),始终以批处理进行。
ThingWorx 9.3.2 中更新的数据读取操作,与事务发布同步进行。
模型操作,在获取事务后保留直至顶层服务完成。
由于处理数据库的所有操作并非全都同步执行并立即使用连接,因此,这些操作统称为模型操作而非数据库操作。
模型操作是影响系统实体的操作。例如:
属性定义更改:添加、移除、更改基本类型等。
配置更改
数据操作是异步执行的数据库操作,为了提高效率,可能会进行批处理。 例如:
更新属性值,即使已持久化。
向数据表、流或值流添加条目。
使用 Eager 事务的平台服务
本节列出以 Eager 模式发布事务的 ThingWorx Platform 服务。
DataTableThing
GetDataTableEntries
GetDataTableEntryByKey
GetDataTableEntryCount
FindDataTableEntries
QueryDataTableEntries
SearchDataTableEntries
使用“流”事物模板的事物
GetStreamEntryCount
QueryStreamData
QueryStreamEntries
QueryStreamEntriesWithData
GetStreamEntry
使用 ValueStream 或 RemoteValueStream 事物模板的事物
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 的事物可以使用这些 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)
什么是模型操作?
由于并非所有同数据库相关的操作均为同步执行并立即使用连接,因此本文将这些操作称为“模型操作”而非“数据库操作”。
模型操作会影响系统实体,而不影响其数据。具体示例包括:
属性定义更改:添加、移除、更改基本类型、等等。
配置更改
有些数据库操作为异步执行,且可能分组执行以提高效率。这些通常包括数据操作:
更新属性值,即使已持久化。
向数据表、流或值流添加条目。
这对您有帮助吗?