冻结其实是控制系统的写进程,让它暂时挂起来,在数据库日志上做个标记。这些都不是那一个数据库比如sample的事情,是整个系统的操作。

你的问题1: 如果我用%SYS命名空间去冻结解冻,备份mgr目录下面sample数据库文件CACHE.DAT,数据是恢复不了的。 怎么恢复不了?那一步出错了? 

问题2: 你是先恢复数据库, 再恢复日志的是吗?出的什么错误? 

这样, 你先看看这两个链接, 如果在有问题, 我找我们的专家和你私聊。第2个帖子有点长,里面连冻结解冻的脚本都包括了, 很详细 ,:)

https://cn.community.intersystems.com/post/faq-%E5%B8%B8%E8%A7%81%E9%97%...

https://community.intersystems.com/post/intersystems-data-platforms-and-...

正常导出用sql, 执行`call %sys.task_tasklist()`。内部并没有一个表,而是直接存成global形式,而且结构还挺复杂真找还是能找到,那么你可以把这个global打包到zpm。

个人以为这是个错误的方法。导入导出global就不是正常该干的事,尤其是对于%SYS库。

如果我做, 我会写个定义task的程序,打在安装包里,到处都能用。

我认为无论你把长度设成多大,占用的存储只由实际数据大小决定。所以设置成MAXLEN=“”是没毛病的。 不过,不确认是否有其他影响, 比如索引占用的空间。 

你说“建表”,可说的又不是create table。如果用create table建表,你总得给个字段长度吧。varchar字段如果你用太长了对于3方工具或者你要抽数到其他数据库的时候会有问题吗? 假设你用了MAXLEN="" , 创建的字段是varchar还是clob?  

我对xml校验的问题也有很多疑问,不知道你这样的方案是不是最好的。 你的方案是逐一对property做标签去处理,还是觉得太麻烦了, 是不是有个interface的实现可能呢? 

顺便说一句, 你的场景设置有点问题。 源头是一个xml, 目的地是一个数据库的表, 中间用对象的方式去处理,好吗?

这是两件事:1. 把log里的记录结构化。 2. 保存到DB。

关于1,如果你用的是最新的iris版本, 可以直接拿到结构化的log, 看这个链接: https://docs.intersystems.com/iris20221/csp/docbook/Doc.View.cls?KEY=ALOG

如果是老版本没有结构化,您得自己去做文本处理。好在这个log非常简单。比如下面两行:

08/30/22-11:03:57:775 (6964) 2 [Utility.Event] Previous system shutdown was abnormal, system forced down or crashed. Fast shutdown complete.
08/30/22-11:03:59:541 (7716) 2 [Utility.Event] Preserving journal files c:\intersystems\hcdemo\mgr\journal\20220824.002 and later for journal recovery and transaction rollback
如果您要只是把日期时间,警告类型,级别,内容分开,它基本就是分开的,用的是空格。

如果您想把内容页结构化,这就花功夫了, 我上面的链接里的工具也不做这个事。

2. 存入DB您得自己解决,IRIS提供文本,API, 没有SQL查询,好在有一大堆监控工具都干这事,就是监控文本文件写入数据库。

您说的“在终端直接执行接口对应方法速度又很快”是什么意思?是在Caché 服务器吗?那么访问的http请求会去IIS吗?

我的建议是在Web服务器上做测试。用soapui,或者postman, 或者curl, 如果这样慢,那么两个可能:要么这个服务就慢, 要么IIS或者CSP Gateway有问题。 可以看看CSP Gateway的event,或者开个trace看看能发现什么。IIS用着用着慢了我是听说过, 但如你表述只是少量的CSP服务受影响,可以先不怀疑它。

数据库有个资源(resource), 是对单个数据库进行权限控制用的。请查询文档中关于资源(Resource)这块的内容配置一些。如果你的数据库创建的时候使用的是默认的%DB_Default, 那你得换一个单独的。