问题标签 [intersystems-cache]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
unicode - 发生系统间缓存意外错误:
我正在尝试将旧的 CACHE.DAT 数据库加载到 Intersystems Cache(2012.1.1 win32 评估)中。我设法创建了一个命名空间和数据库,并且能够查询一些数据库表。
但是,对于其他表,我收到以下错误:
文档告诉我,这意味着在需要一个字节字符的地方读取一个多字节字符。我怀疑这可能意味着原始数据库是 UTF-16,而我的新安装使用的是 UTF-8。
我的问题是:有没有办法转换数据库,配置缓存以便它可以处理,或者以另一种方式处理这个问题?
profiling - 管理 %SYS.PTools.SQLStats 数据
我需要使用 Caché 数据库分析应用程序,并且我正在尝试为此使用CacheMonitor。
我启用了查询统计信息(我想 CacheMonitor 在DO SetSQLStats^%apiSQL(3)
内部执行),两天后,我的服务器磁盘空间不足。恐怕其中的数据太多%SYS.PTools.SQLQuery
,%SYS.PTools.SQLStats
我想腾出一些空间。
是否有任何管理工具来管理这些数据?如何从 sql 统计信息中删除数据?
注意:我对 Caché 的了解几乎为零。
intersystems-cache - 使用父子关系和缓存sql存储的Cache Class编译错误
我有下面列出的全局,我正在尝试使用 sql 存储创建几个缓存类:
全局的前两个下标(Hmo 和 Keen)构成一个唯一条目。第三个下标 (Seq) 有一个属性 (IppLineCount),它是第四个下标级别 (Seq2) 中的 IppLine 的数量。我在下面创建了类 WIppProv,它是父类:
这个类编译得很好。接下来我创建了下面列出的 WIppProvLine 类,并在两者之间建立了父子关系:
当我尝试编译这个时,我收到以下错误:
错误 #5502:编译 SQL 表“XFXA_MCA.WIppProvLine %msg”时出错:表 XFXA_MCA.WIppProvLine 具有以下未映射(未在数据映射中定义)字段:relWIppProv
ERROR #5030:编译类 XFXA.MCA.WIppProvLine 时发生错误,在 2.745 秒内编译期间检测到 1 个错误。
我究竟做错了什么?
提前致谢,弗雷德
intersystems-cache - 使用缓存 sql 存储创建类时如何包含全局的扩展引用?
我正在创建一个映射到现有全局的类,因此它使用缓存 sql 存储而不是默认存储。此类具有扩展引用(UCKE、SYKE),其值在运行时设置。如何在 sql 存储映射中包含扩展引用?我似乎找不到任何有关此的 Intersystmes 文档。
com - 针对 Intersystems Cache 运行 ObjectScript 程序以向 SQL Server 提供数据
背景
我工作的主要应用程序主要基于 InterSystems 的 MUMPS 式 Caché 数据库引擎。一切都存储在全局数组中。从系统中获取数据以进行外部报告的范围从简单的痛苦到极其缓慢和痛苦。
Caché 为数据库提供了一个 ODBC 驱动程序,但除非涉及的全局数组碰巧由选择标准键入,否则它会求助于扫描,一个简单的查询将需要数小时才能运行。就规模而言,整个 Caché 生产命名空间约为 100GB。在这些情况下,我可以编写比 ODBC 驱动程序更快地提取数据的 ObjectScript(Intersystems 的 MUMPS 方言)程序。
我认为部分问题是应用程序供应商不使用 Caché 的对象持久性支持,而是将 SQL 表定义为全局数组的外观,并且它通常不适用于批处理请求。
我在 MS SQL Server 中构建了一个报告数据库,它提取最常见的数据(价值 2.5GB),即使它必须扫描每个表,所有结果也会在 3 秒内返回。不幸的是,刷新数据需要很长时间,所以我只能每周进行一次完全刷新,每天进行一次主动刷新。这足以满足大多数需求,但我想做得更好。
我在 Windows 7 和 Windows Server 2008 R2 上使用 Caché 2007、SQL Server 2008 R2、VS2010。
问题范围
我需要一种将源 Caché 数据库中的实时数据与 SQL Server 上的其他数据集成的方法。我希望能够将视图或表值函数集成到 SQL 查询中,并让它从源数据库中提取实时数据。
实时数据必须在 SQL Server 中可用以进行处理。使用辅助应用程序执行此操作将是一个巨大的痛苦,并且不适用于只希望通过 ODBC 推送查询并获得正确格式的最终数据集的报告工具。
我知道有一些方法可以将数据导入 SQL Server 或完成我想做的相同的一般事情。这不是这个问题的目的。
数据需要来自在 Caché 上运行的 ObjectScript 程序,因为并非我需要的所有数据都通过 SQL 定义的表公开,并且我获得了使性能可用于 ObjectScript 所需的控制。
我正在寻找有关任何新选项的建议,或者我如何改进我尝试或考虑过的选项之一,或者这些方法的其他优点或缺点。
到目前为止我尝试过的
这个项目是一个令人沮丧的练习,我研究过的每条有希望的途径要么很糟糕,要么由于某种原因不起作用。通常原因是对 SQLCLR 程序集的一些不必要的限制。
通过链接服务器通过 InterSystem 的 Caché ODBC 驱动程序提取所有内容。如果 SQL Server 无法将条件推送到远程服务器或必须在本地执行连接,则它通常会求助于扫描。对任何重要表的扫描都需要花费数小时并且是不可接受的。此外,Caché 中的 SQL 表定义错误地定义了许多列的长度;SQL Server 不喜欢这样并中止查询。请参阅这个 SO 问题。我无法更改表定义,供应商认为这不是问题,因为它可以与 MS Access 一起使用。
按需使用 OPENQUERY。这在某种程度上有效,但我仍然可以从上一项中遇到列长度问题,并且无法参数化 OPENQUERY 查询,因此提取上下文数据非常无用。
使用 SQLCLR 通过 CLR 表值函数调用 ODBC 数据提供程序。这解决了参数化和数据长度问题,尽管它确实需要我在每次需要新数据时定义或修改一个函数。不幸的是,并不是我感兴趣的所有数据元素都可以通过 SQL 获得。对于某些事情,我需要直接访问全局数组。
Intersystems 提供了一个ActiveX 控件,允许您在服务器上通过 TCP 运行 ObjectScript 程序并获得结果。这在独立的 C# 应用程序中效果很好,但是一旦我尝试从 SQLCLR 程序集建立连接,我就会收到一个荒谬的 URI 错误:
在执行用户定义的例程或聚合“GetActiveAccounts”期间发生 .NET Framework 错误:System.UriFormatException:无效的 URI:URI 为空。System.UriFormatException: 在 System.Uri.CreateThis(String uri, Boolean dontEscape, UriKind uriKind) 在 System.ComponentModel.Design.RuntimeLicenseContext.GetLocalPath(String fileName) 在 System.ComponentModel. Design.RuntimeLicenseContext.GetSavedLicenseKey(Type type, Assembly resourceAssembly) at System.ComponentModel.LicenseManager.LicenseInteropHelper.GetCurrentContextInfo(Int32& fDesignTime, IntPtr& bstrKey, RuntimeTypeHandle rth) at FacsAccess.GetActiveAccounts.Client.connect() at FacsAccess.GetActiveAccounts.Client.. FacsAccess.GetActiveAccounts.E1.GetEnumerator() 处的 ctor()
请参阅这个未回答的 SO 问题。网上还有其他帖子,但似乎没有人知道。这是一个非常简单的 C++ DLL 的 COM 包装器;它对许可没有任何作用,也没有理由进入托管许可库。我想知道这是否是某种样板文件,它试图获取一个没有名称的程序集的名称,因为它已加载到 SQL 数据库中。
Intersystems 还提供了更直接的非托管接口,但这些接口都是 C++,我无法通过 P/Invoke 使用它,也无法在 SQLCLR 中加载 C++/CLI 混合模式不纯程序集。
我考虑过但似乎有点糟糕的选项
我考虑过通过 SQL Server 的 COM 支持来尝试 ActiveX 控件,但这非常慢而且非常麻烦。
我可以创建一个进程外服务来代理流量,但我不能使用来自 SQLCLR 的 .NET 远程处理,而且你不应该使用 WCF,而且对于这样一个简单的接口来说,它真的很重。我宁愿推出自己的 IPC 接口。
我可以为 VisM 或 CacheDirect 接口编写某种带有 C 风格接口的额外非托管包装器,并通过 P/Invoke 访问它。
看起来这不应该那么难,但它真的把我逼到了墙角,我需要一些观点。
intersystems-cache - 保存使用缓存 sql 存储的缓存对象时更改 RowIds
首先,我为这个问题的长度表示歉意。我以下列方式进行了全局设置:
第一个下标是内部 Hmo,第二个是内部提供,第三个是行号,最后一个是行详细信息号。第 4 下标级别的数据是行的组合审计跟踪历史记录,最高行详细编号为当前行。
我有 3 个具有父子关系的类设置如下: 主类
线类
Line Detail Class Class XFXA.Try3.IppProvLineDetail Extends (%Persistent, %XML.Adaptor) [ ClassType = persistent, Inheritance = right, ProcedureBlock, SqlRowIdName = Id, StorageStrategy = SQLMapping ] {
当用户标记要删除的行时,在第 4 下标级别的当前详细信息行中将已删除标志设置为 1,如果该行不是最后一行,则归档代码移动到最后一行。如果我尝试在我的主类的删除方法中执行此操作,我会收到一条错误消息,指出不允许更新 RowIds。这是因为我试图操纵线类的 Line 属性移动线以将删除的线推到最后。对文档的检查发现 AllowRowIDUpdate 带有一些警告,但不清楚如何使用它的示例。有谁知道实现这一目标的方法?
intersystems-cache - 查找全局下标中点
在 Caché ObjectScript(跨系统的 MUMPS 方言)中,有没有办法有效地跳到全局下标范围的键中的近似中点或线性点?相等,基于记录数。
我想将下标键范围分成大致相等的块,然后并行处理每个块。
知道全局中的键排列在某种二叉树中,这对于底层数据存储引擎来说应该是一个简单的操作,但我不确定是否有接口可以做到这一点。
我可以通过扫描全局的整个键空间来做到这一点,但这会破坏尝试并行运行操作的目的。在这个全局上,顺序扫描需要几个小时。在开始扫描之前,我需要划分密钥空间。
我希望每个线程都对键空间的大小大致相等的连续块进行单独扫描;问题是计算给每个线程的键范围。
unit-testing - Intersystems Caché 的单元测试框架
Intersystems Caché 是否有任何单元测试框架?如果有,请列举一些。
intersystems-cache - 如何在插入/更新期间在行上设置时间戳
每次通过 SQL 更新或插入字段时,我都想设置一个时间戳列。
我尝试使用 SqlComputed 属性,但是如果该字段最初为空,那么当我在 ObjectScript 中使用 %Open 或 %New 和对象时,设置该字段会产生不良影响。我不希望在对象是 %Save'd(或 INSERT'ed/UPDATE'd)之前设置该值。
我怎样才能做到这一点?
intersystems-cache - 系统间缓存 log4 等效项
有谁知道是否有类似于 log4 的东西可用于缓存?
我在许多 .Net 项目中使用了 log4net,并希望拥有具有相同功能的东西。特别是本地、dev、qa 和 prod 环境之间的日志记录级别和配置能力。