1 关注者 · 485 帖子

SQL 是在关系数据库中存储、操作和检索数据的标准语言。

文章 姚 鑫 · 七月 6, 2022 4m read

第二十章 使用工作队列管理器(三)

管理类别

一个类别是一个独立的worker jobs池。当初始化一组worker jobs时,可以指定提供worker的类别。如果集合中的任何worker jobs在执行work项时请求额外的worker jobs,则新的worker jobs来自同一类别。

例如,假设系统提供的 SQL 类别分配了最多 8 个worker。然后,假设与BusinessIntelligence相关的流程创建了一个类别,并将最多四个worker分配给该类别。如果 SQL 池中的所有worker在给定时间都参与了工作,则 BusinessIntelligence 类别中的worker可能仍然可以立即处理工作项。

系统包括两个不能删除的类别:SQLDefault。 SQL 类别适用于系统执行的任何 SQL 处理,包括查询的并行处理。当在未指定类别的情况下初始化一组worker jobs时,默认类别提worker jobs。

每个类别都具有影响该类别中每个工作队列的行为的属性。这些属性是:

DefaultWorkers

当创建此类别中的工作队列且未指定worker job 计数时,这将成为工作队列中worker job 的数量。此属性的默认值是核心数。

MaxActiveWorkers

在此类别的job服务请求池中保留的活动worker job的最大数量。检测到空闲

0
0 158
文章 姚 鑫 · 七月 5, 2022 5m read

第十九章 使用工作队列管理器(二)

基本工作流程

可以通过执行以下步骤来使用工作队列管理器:

  1. ObjectScript 代码划分为工作单元,这些工作单元是满足特定要求的类方法或子例程。
  2. 创建一个工作队列,它是 %SYSTEM.WorkMgr 类的一个实例。为此,请调用 %SYSTEM.WorkMgr 类的 %New() 方法。该方法返回一个工作队列。

可以指定要使用的并行worker jobs的数量,也可以使用默认值,这取决于机器和操作系统。此外,如果已创建类别,则可以指定应从中获取job的类别。

创建工作队列时,工作队列管理器会创建以下工件:

  • 包含有关工作队列的信息的全局变量,例如工作队列在哪个命名空间中运行
  • 工作队列必须处理的序列化工作单元的位置和事件队列
  • 在工作队列完成处理工作单元时创建的完成事件的位置和事件队列
  1. 将工作单元(也称为工作项)添加到工作队列。为此,可以调用 Queue()QueueCallback() 方法。作为参数,传递类方法(或子例程)的名称和任何相应的参数。

对添加到队列的项目立即开始处理。

如果队列中的项目多于队列可用的worker jobs,则job会竞争清空队列。例如,如果有 100 个项目和四个job,则每个job从队列的头部移除一个项目,处理它,然后返回到队列的头部以移除并处理另一个项目。这种模式一直持续到队列为空。

工作队列

0
0 144
文章 姚 鑫 · 七月 4, 2022 7m read

第十八章 使用工作队列管理器(一)

工作队列管理器是的一项功能,使能够通过以编程方式将工作分配给多个并发进程来提高性能。在引入工作队列管理器之前,可能已经使用 JOB 命令在应用程序中启动多个进程并使用自定义代码管理这些进程(以及任何导致的故障)。工作队列管理器提供了一个高效且直接的 API,使能够卸载流程管理。

代码在多个地方内部使用工作队列管理器。可以将它用于自己的需求,如以下部分中的高级描述。

背景

计算机硬件开发的最新创新趋向于高性能、多处理器或多核架构。与此同时,内存和网络设备的速度也只是慢慢地提高了。 开发了工作队列管理器以响应这些趋势并根据以下原则:

  • 硬件资源,包括 CPU 和 I/O、内存和网络设备,都是固定的。
  • 必须尽可能高效地使用硬件资源,以最大限度地提高其执行业务任务的速度。
  • 为了实现最大效率,工作队列管理器必须改善在执行ObjectScript 代码时可能出现的 CPU 利用率不足的问题。
  • 解决 CPU 利用率不足的方法包括排队和优先级划分。

尽管整个数据平台旨在尽可能高效地利用系统中的硬件资源,但该平台的工作队列管理器功能专门设计用于利用现代硬件配置中可用的额外 CPU 资源。工作队列管理器有两个关键用途:

  • 提供一个框架,使能够将大型编程任务分解成更小的块,以便在多个并发进程中执行。通过一次使用多个 CPU,工作队列管理器显着减少了处理大型工作负载所
0
0 149
文章 姚 鑫 · 七月 3, 2022 5m read

第十七章 进程内存

介绍

进程使用许多不同的资源来实现其目标。其中包括部分或全部 CPU 周期、内存、外部存储、网络带宽等。这篇文章是关于内存使用的。具体来说,它处理为数据存储分配的内存,例如:

  • 公共和私有变量

当第一次为它们分配值时,它们被分配了内存空间。在局部数组的情况下,局部变量名称加上所有下标的值的组合引用单个变量值。

除了包含极长字符串的变量外,变量会占用与 $STORAGE 相关的空间。包含极长字符串的变量以不同方式存储,并且不占用 $STORAGE 中的空间。

  • 对象实例

每当实例化一个对象时,都会分配空间来保存对象的当前内容以及它所引用的对象。删除最后一个对象引用时返回该空间。

  • 本地 I/O 缓冲区

将与该进程正在使用的设备相关联的 I/O 缓冲区存储在进程空间中。

管理进程空间

进程从用于上述实体的初始内存池开始。当应用程序创建它们时,它们会消耗池中的内存;当应用程序删除它们时,它们的内存将返回到池中。例如,当一个例程开始执行时,总是会创建消耗一些内存的局部变量;当例程返回并且这些变量超出范围时,这些变量使用的内存将被返回并可供重用。

当应用程序需要内存,并且进程在其内存池中没有足够大(连续)的可用内存区域来满足需求时,该进程会从底层操作系统请求额外的内存块以添加到其池中。稍后,如果该内存块完全未使用,它将返回给操作系统。由于为实体分配内存的顺序和从内存

0
0 142
文章 姚 鑫 · 七月 2, 2022 5m read

第十六章 字符串本地化和消息字典(二)

XML 消息文件

XML 消息文件是消息字典的导出。这也是希望导入的任何消息的必需格式。

只要有可能,XML 消息文件应该使用 UTF-8 编码。但是,在某些情况下,开发人员或翻译人员可能会使用本地平台编码,例如 shift-jis,以便于编辑 XML 消息文件。无论 XML 文件使用何种编码,应用程序的语言环境都必须支持它,并且它必须能够表达该语言的消息。

XML 消息文件可能包含一种语言和多个域的消息。

<MsgFile> Element

<MsgFile> 元素是 XML 消息文件的顶级容器,每个文件只有一个 <MsgFile>元素。

<MsgFile>元素有一个必需的属性,Language<MsgFile>Language 属性的值是一个全小写的 RFC1766 代码,用于标识文件的语言。它由一个或多个部分组成:主要语言标签(例如 enja)可选地后跟连字符 (-) 和次要语言标签(en-gbja-jp)。

在以下示例中,此语言为“en”(英语)。

<?xml version="1.0" encoding="utf-8" ?>
<MsgFile Language="en">
   <MsgDomain Domain="sample">
       <Message Id="source">Source</Messa
0
0 110
文章 姚 鑫 · 七月 1, 2022 4m read

第十五章 字符串本地化和消息字典(一)

本文概述了字符串本地化,并描述了如何导出、导入和管理消息字典。

字符串本地化

当本地化应用程序的文本时,会创建一种语言的文本字符串清单,然后当应用程序区域设置不同时,建立约定以另一种语言替换这些消息的翻译版本。

支持以下本地化字符串的过程:

  1. 开发人员在他们的代码中包含可本地化的字符串(在REST 应用程序或商业智能模型中)。

这种机制各不相同,但最常见的机制是 $$$Text 宏。代替硬编码的文字字符串,开发人员包含 $$$Text 宏的实例,为宏参数提供如下值:

  • 默认字符串
  • 此字符串所属的域(将字符串分组为域时,本地化更易于管理)
  • 默认字符串的语言代码
write "Hello world"

替换为

write $$$TEXT("Hello world","sampledomain","en-us")
  1. 编译代码时,编译器会在消息字典中为 $$$Text 宏的每个唯一实例生成条目。

消息字典是全局的,因此可以在管理门户中轻松查看(例如)。有一些类方法可以帮助完成常见任务。

  1. 开发完成后,发布工程师导出该域或所有域的消息字典。

结果是一个或多个 XML 消息文件,其中包含原始语言的文本字符串。

  1. 发布工程师将这些文件发送给翻译人员,请求翻译版本。

  2. 翻译人员使用他们喜欢的任何 XML 创作工具来处理 XML 消息文件。从本

image

0
0 172
文章 姚 鑫 · 六月 30, 2022 2m read

第十四章 信号(四)- 多进程任务示例

可根据此思想进行多任务启动查询汇总数据。

原理

  • 利用job机制开启后台进程。
  • 利用loop循环减少进程的数量等于开启进程的数量,判断多进程任务是否完成。
  1. 创建表并插入1000W条数据,统计Moeny字段总金额

  2. 创建demo代码如下。

Class Demo.SemaphoreDemo Extends %RegisteredObject
{

///  Do ##class(Demo.SemaphoreDemo).Sample(5)
ClassMethod Sample(pJobCount = 3)
{
	k ^yx("Amt"),^yxAmt
	
	 /* 1.启动信号 */
    s mSem = ##class(Demo.Sem).%New()
    If ('($isobject(mSem))) 
    {
		q "启动失败"
    }
    
    /* 2. 初始化信号量为0 */
    d mSem.Init(0)
    
    s t1 = $zh
    
    /* 3. 按指定数量,启动后台任务 */
    for i = 1 : 1 : pJobCount
    {
        j ..Task(i)
    }
    
    w "启动job时间:"_ ($zh - 
0
0 114
文章 姚 鑫 · 六月 29, 2022 10m read

第十三章 信号(三)- 示例演示

运行示例

MainProducerConsumer 这三个类中的每一个都有自己的 Run 方法,最好在各自的终端窗口中运行它们。每次运行时,它都会显示它为日志生成的消息。一旦用户通过提供它正在等待的输入来响应 Main 类,MainRun 方法将终止删除信号量。然后,用户可以通过键入命令查看所有进程的合并日志文件的显示

  Do ##class(Semaphore.Util).ShowLog()

注意:以下所有示例都假定所有类都已在“USER”命名空间中编译。

示例 1 - 创建和删除信号量

最简单的例子演示了信号量的创建和销毁。它使用 Semaphore.Main 类。请执行下列操作:

  1. 打开一个终端窗口。
  2. 输入命令——
Do ##class(Semaphore.Main).Run()
  1. 该方法创建信号量。如果成功,将看到消息“输入任何字符以终止运行方法”。按下 Enter 键。该方法显示信号量的初始化值,将其删除,然后退出。
  2. 通过发出命令显示日志文件
Do ##class(Semaphore.Util).ShowLog()

按照上述步骤在终端窗口中显示的消息示例如下

消息示例如下

DHC-APP>Do ##class(Semaphore.Main).Run()
(1) Main Started
(2) New sema
0
0 153
文章 姚 鑫 · 六月 27, 2022 7m read

第十二章 信号(二)- 生产者消费者示例

下面是一系列使用信号量实现生产者/消费者场景的类。 “主”进程初始化信号量并等待用户指示活动已全部完成。生产者在循环中随机增加一个信号量值,更新之间的延迟可变。消费者尝试在随机时间从信号量中删除随机数量,也是在循环中。该示例由 5 个类组成:

  • Main – 初始化环境并等待信号量上的活动完成的类。
  • Counter – 实现信号量本身的类。它记录它的创建以及由于信号量在等待列表中而发生的任何回调。
  • Producer – 一个类,其主要方法增加信号量值。增量是一个随机选择的小整数。完成增量后,该方法会在下一个增量之前延迟一小段随机数秒。
  • Consumer 消费者——这是对生产者的补充。此类的主要方法尝试将信号量减少一个随机选择的小整数。它将递减请求添加到其等待列表中,等待时间也是随机选择的秒数。
  • Util - 这个类有几个方法被示例的其他类使用。几种方法解决了为所有活动维护公共日志的问题;其他人解决了多个消费者和多个生产者的命名问题。

注意:组成这些类的代码特意写得简单。尽可能地,每个语句只完成一个动作。这应该使用户更容易和更直接地修改示例。

Class: Semaphore.Main

此类建立演示环境。它调用实用程序类来初始化日志和名称索引工具。然后它用初始值 0 初始化公共信号量,并等待用户输入一个字符(通常是 ENTER 键),表明实

0
0 160
文章 姚 鑫 · 六月 26, 2022 7m read

第十一章 信号(一) - 概念

背景

维基百科对信号量有这样的定义:“在计算机科学中,特别是在操作系统中,信号量是一种变量或抽象数据类型,用于控制多个进程在并行编程或多用户环境中对公共资源的访问。”信号量不同于互斥体(或锁)。互斥锁最常用于管理竞争进程对单个资源的访问。当一个资源有多个相同的副本并且这些副本中的每一个都可以由单独的进程同时使用时,就会使用信号量。

考虑一个办公用品商店。它可能有几台复印机供其客户使用,但每台复印机一次只能由一个客户使用。为了控制这一点,有一组键可以启用机器并记录使用情况。当客户想要复印文件时,他们向职员索取钥匙,使用机器,然后归还钥匙,并支付使用费。如果所有机器都在使用,客户必须等到钥匙归还。保存键的位置用作信号量。

该示例可以进一步推广到包括不同类型的复印机,也许可以通过它们可以制作的副本的大小来区分。在这种情况下,将有多个信号量,如果复制者在复制的大小上有任何重叠,那么希望复制共同大小的客户将有两个资源可供提取。

介绍

信号量是共享对象,用于在进程之间提供快速、高效的通信。每个信号量都是类 %SYSTEM.Semaphore 的一个实例。信号量可以建模为一个共享变量,它包含一个 64 位非负整数。信号量上的操作在共享它的所有进程中以同步的方式更改变量的值。按照惯例,值的变化会在共享信号量的进程之间传递信息。

尽管信号量和锁似乎有很多共同点,但使用

0
0 198
文章 姚 鑫 · 六月 25, 2022 2m read

第十章 设置结构化日志记录(二)

注:IRIS有,Cache无。

启用结构化日志记录

^LOGDMN 例程允许管理结构化日志记录;还有一个基于类的 API,将在下一节中介绍。

要使用 ^LOGDMN 启用结构化日志记录:

  1. 打开终端并输入以下命令:
set $namespace="%sys"
do ^LOGDMN

这将启动一个带有以下提示的例程:

 
1) Enable logging
2) Disable logging
3) Display configuration
4) Edit configuration
5) Set default configuration
6) Display logging status
7) Start logging
8) Stop logging
9) Restart logging
 
LOGDMN option?
  1. 4 以便可以指定配置详细信息。然后,该例程会提示输入以下项目:

a. 最低日志级别,以下之一:

  • -2 — 详细的调试消息(例如十六进制转储)。
  • -1 — 不太详细的调试消息。
  • 0 — 信息性消息,包括所有审计事件。
  • 1(默认值)— 警告,表示可能需要注意但未中断操作的问题。
  • 2 — 严重错误,表明问题已中断操作。
  • 3 — 致命错误,表示问题导致系统无法运行。

b. 管道命令,它指定系统将结构化日志发送到哪里。

0
0 155
文章 姚 鑫 · 六月 24, 2022 4m read

第九章 设置结构化日志记录(一)

IRIS 支持结构化日志记录。

创建多个日志,每个日志用于不同的目的。从以前的产品迁移过来的客户可以像过去一样利用这些日志,但现在还可以将所有日志信息导入一个单一的、中央的、机器可读的日志文件——结构化日志。然后可以将此文件与第三方分析工具一起使用。

本文概述了结构化日志中的信息,展示了日志示例,并描述了如何启用结构化日志记录。

结构化日志中可用的信息

当启用结构化日志记录时,系统会将相同的数据写入结构化日志,它也会写入其他日志(无论哪个)。例如,系统将相同的行写入messages.log 和结构化日志。

启用结构化日志记录后,结构化日志包含以下所有信息:

  • 写入messages.log 的信息。这包括需要注意的警报、有关系统启动和关闭的信息、有关日志文件和 WIJ 文件的高级信息、有关配置更改 (CPF) 的信息以及与许可相关的信息。
  • 写入审计数据库的信息。详细信息取决于正在审核的事件。

示例输出

本部分显示结构化日志记录实用程序的示例输出,用于名称/值对格式和 JSON 格式。

名称/值对

以下输出使用格式选项 NVP(名称/值对)。此示例经过编辑以用于显示目的;在实际输出中,每个条目只占一行,条目之间没有空行。

when="2019-08-01 18:43:02.216" pid=8240 level=SEVERE event=Utilit
0
0 188
文章 姚 鑫 · 六月 23, 2022 3m read

第八章 操作位和位串(四)

操作以整数形式实现的位串

设置位

要创建一个存储为整数的新位串,请对每个位求和 2 的幂:

set bitint = (2**2) + (2**5) + (2**10)
 
write bitint
1060

要将现有位串中的位设置为 1,请使用 $zboolean 函数(逻辑 OR)的选项7(arg1 ! arg2)

set bitint = $zboolean(bitint, 2**4, 7)

write bitint
1076

要将现有位串中的位设置为 0,请使用 $zboolean 函数的选项 2(arg1 & ~arg2)


set bitint = $zboolean(bitint, 2**4, 2)

write bitint
1060

要在现有位串中切换位,请使用 $zboolean 函数(逻辑 XOR)的选项 6(arg1 ^ arg2)

set bitint = $zboolean(bitint, 2**4, 6)

write bitint
1076
set bitint = $zboolean(bitint, 2**4, 6)

write bitint
1060

测试位是否已设置

要将位字符串显示为整数,可以使用如下方法,该方法循环位并使用 $zboolean 函数:

Class Util.BitUtil 
0
0 152
文章 姚 鑫 · 六月 22, 2022 4m read

第七章 操作位和位串(三)

操作位串

要创建新的位串,请使用 $bit 函数将所需位设置为 1

kill bitstring
 
set $bit(bitstring, 3) = 1
 
set $bit(bitstring, 6) = 1
 
set $bit(bitstring, 11) = 1

使用 $bit 将现有位串中的位设置为 1

set $bit(bitstring, 5) = 1

使用 $bit 将现有位串中的位设置为 0

set $bit(bitstring, 5) = 0

由于位串中的第一位是位 1,因此尝试设置位 0 会返回错误:

set $bit(bitstring, 0) = 1
 
SET $BIT(bitstring, 0) = 1
^
<VALUE OUT OF RANGE>

测试位是否已设置

要测试是否在现有位串中设置了位,还可以使用 $bit 函数:

write $bit(bitstring, 6)
1
write $bit(bitstring, 5)
0

如果测试未明确设置的位,则 $bit 返回 0:

write $bit(bitstring, 4)
0
write $bit(bitstring, 55)
0

显示位

要显示位串中的位,请使用 $bitcount 函数获取位串中位的计数,然后遍历位:

for i=1:1:$b
0
0 126
文章 姚 鑫 · 六月 21, 2022 3m read

第六章 操作位和位串(二)

将位序列存储为整数

如果要将一系列布尔参数传递给方法,一种常见的方法是将它们作为编码为单个整数的位序列传递。

例如,Security.System.ExportAll() 方法用于从 IRIS 实例中导出安全设置。如果查看此方法的类引用,将看到它的定义如下:

classmethod ExportAll(FileName As %String = "SecurityExport.xml", 
ByRef NumExported As %String, Flags As %Integer = -1) as %Status

第三个参数 Flags 是一个整数,其中每个位代表一种可以导出的安全记录。

Flags - What type of records to export to the file, -1 = ALL
Bit 0 - System
Bit 1 - Events
Bit 2 - Services
Bit 4 - Resources
Bit 5 - Roles
Bit 6 - Users
Bit 7 - Applications
Bit 8 - SSL Configs
Bit 9 - PhoneProvider
Bit 10 - X509Credential
Bit 11 - OpenAMIdentityService
Bit 12 - SQL 
0
0 149
文章 姚 鑫 · 六月 20, 2022 4m read

第五章 操作位和位串

有时可能希望在基于数据平台的应用程序中存储一系列相关的布尔值。可以创建许多布尔变量,也可以将它们存储在数组或列表中。或者可以使用称为“位串”的概念,它可以定义为位序列,首先呈现最低有效位。位串允许您以非常有效的方式存储此类数据,无论是在存储空间还是处理速度方面。

位串可以以两种方式之一存储,作为压缩字符串或整数。如果在没有上下文的情况下听到术语“位串”,则表示位序列存储为压缩字符串。本文向介绍了这两种类型的位串,然后介绍了一些可用于操作它们的技术。

将位序列存储为位串

存储位序列的最常见方式是在位串中,这是一种特殊的压缩字符串。除了节省存储空间外,还可以使用 ObjectScript 系统函数有效地操作位串。

这样的系统函数是 $factor,它将整数转换为位串。我们可以通过执行以下语句将整数 11744 转换为位串:

set bitstring = $factor(11744)

要查看位串内容的表示,可以使用 zwrite 命令:

zwrite bitstring
bitstring=$zwc(128,4)_$c(224,45,0,0)/*$bit(6..9,11,12,14)*/

起初它看起来很神秘,但在输出的末尾,会看到一条注释,其中显示了已设置的实际位的列表:6789111214。位串中的位 1表示 2^0,位 2 表示 2^1,依

0
0 156
文章 姚 鑫 · 六月 19, 2022 3m read

第四章 锁定和并发控制(四)

避免死锁

增量锁定具有潜在危险,因为它可能导致称为死锁的情况。当两个进程各自对已被另一个进程锁定的变量断言增量锁定时,就会出现这种情况。因为尝试的锁是增量的,所以现有的锁不会被释放。结果,每个进程在等待另一个进程释放现有锁的同时挂起。

举个例子:

  1. 进程 A 发出此命令:lock + ^MyGlobal(15)
  2. 进程 B 发出此命令:lock + ^MyOtherGlobal(15)
  3. 进程 A 发出此命令:lock + ^MyOtherGlobal(15)

LOCK 命令不返回;进程被阻塞,直到进程 B 释放这个锁。

  1. 进程 B 发出此命令:lock + ^MyGlobal(15)

LOCK 命令不返回;进程被阻塞,直到进程 A 释放这个锁。但是,进程 A 被阻塞,无法释放锁。现在这些进程都在等待对方。

有几种方法可以防止死锁:

  • 始终包含 timeout 参数。
  • 对于发出增量 LOCK 命令的顺序,请遵循严格的协议。只要所有进程都遵循相同的锁名称顺序,就不会发生死锁。一个简单的协议是按排序顺序添加锁。
  • 使用简单锁定而不是增量锁定;也就是说,不要使用 + 运算符。如前所述,对于简单锁定,LOCK 命令首先释放进程持有的所有先前锁定。 (然而,在实践中,简单的锁定并不经常使用。)

如果发生死锁,可以使用管理门户或 ^LOCKTAB

锁的实

0
0 212
文章 姚 鑫 · 六月 17, 2022 7m read

第三章 锁定和并发控制(三)

升级锁

使用升级锁来管理大量锁。当锁定数组的节点时,它们是相关的,特别是当将多个节点锁定在同一下标级别时。

当给定进程在同一数组中的给定下标级别创建了超过特定数量(默认为 1000)的升级锁时, 将删除所有单独的锁名称并用新锁替换它们。新锁位于父级,这意味着数组的整个分支被隐式锁定。示例(如下所示)演示了这一点。

应用程序应在合适的情况下尽快释放特定子节点的锁(与非升级锁完全相同)。当释放锁时, 会减少相应的锁计数。当的应用程序移除足够多的锁时,会移除父节点上的锁。第二小节显示了一个示例。

锁升级示例

假设有 1000^MyGlobal("sales","EU",salesdate) 形式的锁,其中 salesdate 表示日期。锁表可能如下所示:

注意 Owner 19776 的条目(这是拥有锁的进程)。 ModeCount 列指示这些是共享的、升级的锁。

当同一进程试图创建另一个相同形式的锁时, 会升级它们。它会移除这些锁并用名称为 ^MyGlobal("sales","EU") 的单个锁替换它们。现在锁表可能如下所示:

ModeCount 列表明这是一个共享的升级锁,它的计数是 1001

请注意以下关键点:

  • ^MyGlobal("sales","EU") 的所有子节点现在都被隐式锁定,遵循数组锁定的基本规则。
  • 锁定表不再包含有关 ^M

image

0
0 141
文章 姚 鑫 · 六月 16, 2022 4m read

第二章 锁定和并发控制(二)

关于零超时的说明

如上所述,如果您将 timeout 指定为 0, 会添加锁。但是,如果使用零超时锁定父节点,并且已经在子节点上锁定,则忽略零超时并使用内部 1 秒超时。

删除锁

要删除默认类型的锁,请使用 LOCK 命令,如下所示:

LOCK -lockname

如果执行此命令的进程拥有具有给定名称的锁(默认类型),则此命令将删除该锁。或者,如果进程拥有多个锁(默认类型),此命令将删除其中一个。

或者删除另一种类型的锁:

LOCK -lockname#locktype

其中 locktype 是一串锁类型代码。

LOCK 命令的其他基本变体

为了完整起见,本节讨论 LOCK 命令的其他基本变体:使用它来创建简单的锁并使用它来删除所有锁。这些变化在实践中并不常见。

创建简单的锁

对于 LOCK 命令,如果省略 + 运算符,LOCK 命令首先会删除该进程持有的所有现有锁,然后尝试添加新锁。在这种情况下,锁称为简单锁而不是增量锁。一个进程可以拥有多个简单的锁,如果该进程使用如下语法同时创建它们:

 LOCK (^MyVar1,^MyVar2,^MyVar3)

简单的锁在实践中并不常见,因为通常需要持有多个锁并在代码的不同步骤中获取它们。因此使用增量锁更实用。

但是,如果简单锁适合,请注意,可以在创建简单锁时指定 locktypetimeout





0
0 89
文章 姚 鑫 · 六月 15, 2022 5m read

第一章 锁定和并发控制(一)

任何多进程系统的一个重要特征是并发控制,即防止不同进程同时更改特定数据元素的能力,从而导致损坏。 提供了一个锁管理系统。本文提供了一个概述。

此外,%Persistent 类提供了一种控制对象并发访问的方法,即 %OpenId() 的并发参数和该类的其他方法。这些方法最终使用本文讨论的 ObjectScript LOCK 命令。所有持久对象都继承这些方法。同样,系统会自动对 INSERTUPDATEDELETE 操作执行锁定(除非指定 %NOLOCK 关键字)。

%Persistent 类还提供方法 %GetLock()%ReleaseLock()%LockId()%UnlockId()%LockExtent()%UnlockExtent()

介绍

基本的锁定机制是 LOCK 命令。此命令的目的是延迟一个进程中的活动,直到另一个进程发出可以继续进行的信号。

锁本身并不能阻止活动行为。锁定仅按约定起作用:它要求相互竞争的进程都使用相同的锁定名称实现锁定。例如,下面描述了一个常见的场景:

  1. 进程 A 发出 LOCK 命令, 创建一个锁(默认情况下,一个独占锁)。通常,进程 A 然后对global中的节点进行更改。详细信息是特定于应用程序的。
  2. 进程 B 发出具有相同锁名称的 LOCK 命令。因为存在一个现有的排他锁,所以进程 B 暂停
0
0 131
文章 姚 鑫 · 六月 14, 2022 5m read

第九章 其他参考资料(二)

特殊变量 (SQL)

系统提供的变量。

$HOROLOG
$JOB
$NAMESPACE
$TLEVEL
$USERNAME
$ZHOROLOG
$ZJOB
$ZPI
$ZTIMESTAMP
$ZTIMEZONE
$ZVERSION

SQL直接支持许多对象脚本特殊变量。这些变量包含系统提供的值。只要可以在SQL中指定文字值,就可以使用它们。

SQL特殊变量名不区分大小写。大多数可以使用缩写来指定。

VariableNameAbbreviationData Type Returned Use
$HOROLOG$H%String/VARCHAR当前进程的本地日期和时间
$JOB$J%String/VARCHAR当前进程的 job ID
$NAMESPACEnone%String/VARCHAR当前命名空间名称
$TLEVEL$TL%Integer/INTEGER
$USERNAMEnone%String/VARCHAR当前进程的用户名
$ZHOROLOG$ZH%Numeric/NUMERIC(21,6)自InterSystems IRIS启动后经过的秒数
$ZJOB$ZJ%Integer/INTEGER当前进程的job状态
$ZPInone%Numeric/NUM
0
0 130
文章 姚 鑫 · 六月 13, 2022 5m read

第八章 其他参考资料(一)

默认用户名和密码(SQL)

IRIS® 数据平台提供了用于登录数据库和开始使用的默认用户名和密码。默认用户名为“_SYSTEM”(大写),密码为“sys”。

SQLCODE错误代码(SQL)

执行大多数 SQL操作都会发出SQLCODE值。发出的SQLCODE值为0100和负整数值。

  • SQLCODE=0表示SQL操作成功完成。对于SELECT语句,这通常意味着从表中成功检索数据。但是,如果SELECT执行聚合操作(例如:SELECT SUM(Myfield)),则聚合操作成功,即使myfield中没有数据,也会发出SQLCODE=0;在这种情况下,SUM返回NULL%ROWCOUNT=1
  • SQLCODE=100表示SQL操作成功,但没有找到可操作的数据。发生这种情况的原因有很多。对于SELECT,这些包括:指定表不包含数据;表不包含满足查询条件的数据;或者行检索已到达表的最后一行。对于UPDATEDELETE,它们包括:指定的表不包含数据;或者表不包含满足WHERE子句条件的数据行。在这些情况下,%ROWCOUNT=0
  • SQLCODE=-n表示错误。负整数值指定发生的错误类型。SQLCODE=-400是通用的致命错误代码。

字段约束(SQL)

字段约束指定管理字段允许的数据值的规则。一个字段可能有以下约束:

  • NOT NULL非空:必须在每
0
0 263
文章 姚 鑫 · 五月 12, 2021 4m read

第五章 管理全局变量(一)

管理门户提供管理全局变量的工具,系统类提供执行某些相同任务的方法。本章介绍如何使用这些工具。

一般建议

与ObjectScript命令SETMERGEKILL和其他命令一样,这里描述的工具提供了直接访问操作全局变量的权限。如果通过全局访问删除或修改,则会绕过所有对象和SQL完整性检查,并且没有撤消选项。因此,在执行这些任务时要非常小心,这一点很重要。(查看和导出不会影响数据库,并且是安全活动。)

使用本章中介绍的工具时,请确保以下事项:

  • IRIS使用哪些全局变量。并不是所有这些都被视为“系统”全局变量-也就是说,即使没有选中“系统”复选框,它们中的一些也是可见的。其中一些全局变量存储代码,包括的代码。
  • 确保知道应用程序使用哪些全局变量。

即使应用程序从不执行任何直接全局访问,应用程序也会使用全局变量。请记住,如果创建持久类,则它们的数据和任何索引都存储在全局变量中,全局变量的名称基于类名(默认情况下)。

“全局变量”页简介

管理门户包括全局页面,该页面允许管理全局。在此页上,可以执行以下操作:

  • 在该全局的行中选择View以检查它。
  • 在该全局的行中选择编辑以对其进行修改。
  • 选择导出以导出全局变量。
  • 选择导入以导入全局变量。
  • 选择删除以删除全局变量。
  • 选择查找以查找全局变量中的值。

此页还包括用于查看例程和类的选项;此处不讨论这些选项。

要从管

1
0 183
文章 姚 鑫 · 六月 12, 2022 5m read

第七章 日期和时间构造

验证和转换 ODBC 日期、时间或时间戳。

大纲

{d 'yyyy-mm-dd'}
{d nnnnnn}

{t 'hh:mm:ss[.fff]'}
{t nnnnn.nnn}

{ts 'yyyy-mm-dd [hh:mm:ss.fff]'}
{ts 'mm/dd/yyyy [hh:mm:ss.fff]'}
{ts nnnnnn}

描述

这些构造采用 ODBC 日期、时间或时间戳格式的整数或字符串,并将其转换为相应的 IRIS 日期、时间或时间戳格式。他们执行数据输入以及值和范围检查。

{d 'string'}

{d 'string'}日期构造验证 ODBC 格式的日期。如果日期有效,它将以 IRIS $HOROLOG 日期格式存储(逻辑模式)作为 1840-12-31 的整数计数值。 IRIS 不附加默认时间值。要支持早于 1840-12-31 的日期,必须在表中定义数据类型为 %Library.Date(MINVAL=-nnn) 的日期字段,其中 MINVAL 是从 1840-12-31 倒数的负天数(第 0 天)最大为 -672045 (0001-01-01)

  • 小于 -672045 (0001-01-01) 或大于 2980013 (9999-12-31) 的整数会生成 SQLCODE -400 <VALUE OUT OF RANGE>
0
0 297
文章 姚 鑫 · 六月 11, 2022 4m read

第六章 数据类型(五)

数据类型的整数代码

在查询元数据和其他上下文中,为列定义的数据类型可以作为整数代码返回。 CType(客户端数据类型)整数代码列在 %SQL.StatementColumnclientType 属性中。

ODBC 和 JDBC 使用 xDBC 数据类型代码 (SQLType)。 ODBC 数据类型代码由 %SQL.Statement.%Metadata.columns.GetAt() 方法返回,如上例所示。 SQL Shell 元数据还返回 ODBC 数据类型代码。 JDBC 代码与 ODBC 代码相同,除了时间和日期数据类型的表示。下面列出了这些 ODBC 和 JDBC 值:

ODBCJDBCData Type
-11-11GUID
-7-7BIT
-6-6TINYINT
-5-5BIGINT
-4-4LONGVARBINARY
-3-3VARBINARY
-2-2BINARY
-1-1LONGVARCHAR
00Unknown type
11CHAR
22NUMERIC
33DECIMAL
44INTEGER
55SMALLINT
66FLOAT
77REAL
88DOUBLE
991DATE
0
0 143
文章 姚 鑫 · 六月 10, 2022 8m read

第五章 数据类型(四)

Strings

%Library.String 数据类型支持的最大字符串长度为 3,641,144 个字符。通常,极长的字符串应分配为 %Stream.GlobalCharacter 数据类型之一。

因为 IRIS 支持 xDBC 协议 50 和更高版本,所以没有强制执行 ODBC 或 JDBC 字符串长度限制。如果 IRIS 实例和 ODBC 驱动程序支持不同的协议,则使用两个协议中较低的一个。实际使用的协议记录在 ODBC 日志中。

请注意,默认情况下 IRIS 建立系统范围的 ODBC VARCHAR 最大长度为 4096;此 ODBC 最大长度是可配置的。

列表结构

IRIS 支持列表结构数据类型 %List(数据类型类 %Library.List)。这是一种压缩的二进制格式,不会映射到 SQL 的相应本机数据类型。在其内部表示中,它对应于数据类型 VARBINARY,默认 MAXLEN32749。 IRIS 支持列表结构数据类型 %ListOfBinary(数据类型类 %Library.ListOfBinary)对应于数据类型 VARBINARY,默认 MAXLEN4096

因此,动态 SQL 不能在 WHERE 子句比较中使用 %List 数据。也不能使用 INSERTUPDATE 来设置 %List 类型的属性值。

动态 S

0
0 234
文章 姚 鑫 · 六月 9, 2022 6m read

第四章 数据类型(三)

日期、时间、PosixTime 和时间戳数据类型

可以定义日期、时间和时间戳数据类型,并通过标准 SQL 日期和时间函数相互转换日期和时间戳。例如,可以使用 CURRENT_DATECURRENT_TIMESTAMP 作为使用该数据类型定义的字段的输入,或者使用 DATEADDDATEDIFFDATENAMEDATEPART 来操作使用该数据类型存储的日期值。

数据类型类 %Library.Date%Library.Time%Library.PosixTime%Library.TimeStamp%MV.Date 对于 SqlCategory 的处理方式如下:

  1. %Library.Date 类以及逻辑值为 +$HOROLOG$HOROLOG 的日期部分)的任何用户定义数据类型类都应使用 DATE 作为 SqlCategory。默认情况下,DATE 和对应的 %Library.Date 数据类型只接受正整数,0 代表 1840-12-31。要支持早于 1840-12-31 的日期,必须在表中定义数据类型为 %Library.Date(MINVAL=-nnn) 的日期字段,其中 MINVAL 是从 1840-12-31 倒数的负天数最大为 -672045 (0001-01-01)%Library.Date 可以将日期值存储为 -6
0
0 227
文章 姚 鑫 · 六月 8, 2022 4m read

第三章 数据类型(二)

SQL 系统数据类型映射

上表中为 DDL 和 IRIS 数据类型表达式显示的语法是为 SQL.SystemDataTypes 配置的默认映射。对于提供的系统数据类型和用户数据类型,有单独的映射表可用。

要查看和修改当前数据类型映射,请转到管理门户,选择系统管理、配置、SQL 和对象设置、系统 DDL 映射。

了解 DDL 数据类型映射

将数据类型从 DDL 映射到 IRIS 时,常规参数和函数参数遵循以下规则:

  • 常规参数 - 这些在 DDL 数据类型和 IRIS 数据类型中以 %# 格式标识。例如:
     VARCHAR(%1)

映射到:

     %String(MAXLEN=%1)

因此,DDL 数据类型为:

     VARCHAR(10)

映射到:

     %String(MAXLEN=10)
  • 函数参数 — 当 DDL 数据类型中的参数必须经过一些转换才能放入 IRIS 数据类型中时,使用这些参数。这方面的一个例子是将 DDL 数据类型的数值精度和比例参数转换为 IRIS 数据类型的 MAXVALMINVALSCALE 参数。例如:
     DECIMAL(%1,%2)

映射到:

     %Numeric(MAXVAL=<|'$$maxval^%apiSQL(%1,%2)'|>,
              M
0
0 133
文章 姚 鑫 · 六月 7, 2022 9m read

第二章 数据类型(一)

指定 SQL 实体(如列)可以包含的数据类型。

描述

此处描述了以下主题:

  • 支持的 DDL 数据类型及其类属性映射表

  • 数据类型优先级用于从具有不同数据类型的数据值中选择最具包容性的数据类型

  • 日期、时间、PosixTime 和时间戳数据类型

    • 使用SqlCategory和用户定义的标准
    • 对 1840 年 12 月 31 日之前的日期的可配置支持
  • 支持字符串数据类型、列表数据类型和流数据类型

  • 支持 ROWVERSION 数据类型

  • IRIS® 数据平台 ODBC / JDBC 公开的数据类型

  • 使用查询元数据方法和数据类型整数代码确定列的数据类型

  • 创建用户定义的数据类型

  • 处理未定义的数据类型

  • 数据类型转换函数

数据类型指定列可以保存的值的种类。在使用 CREATE TABLEALTER TABLE 定义字段时指定数据类型。定义 SQL 字段时,可以指定下表(左列)中列出的 DDL 数据类型。当指定其中一种 DDL 数据类型时,它会映射到右侧列中列出的IRIS 数据类型类。在IRIS 中定义字段时,可以指定 DDL 数据类型或数据类型类。 DDL 数据类型名称不区分大小写。数据类型类名称区分大小写。 %Library 数据类型类可以通过全名(例如,%Library.String)或短名(%String)来指定。

它们

image

0
0 198