0 关注者 · 21 帖子

Java 数据库连接 (JDBC) 是 Java 编程语言的应用程序编程接口 (API),用于定义客户端如何访问数据库。

目前可从此处下载。

文章 Nicky Zhu · 十月 28, 2025 9m read

技术文档 — Quarkus IRIS Monitor System

1. 目的与范围

此模块支持在基于 Quarkus 的 Java 应用程序与 InterSystems IRIS 的原生性能监控功能之间进行集成。
它使开发者可以通过 @PerfmonReport 对方法添加注释,这样可以在执行方法时自动触发 IRIS 的 ^PERFMON 例程,以生成性能报告,而无需人工干预。


2. 系统组件

2.1 注释:@PerfmonReport

  • 定义为 CDI InterceptorBinding
  • 可应用于方法或类。
  • 指示使用 IRIS 监控逻辑包装方法执行的框架。

2.2 拦截器:PerfmonReportInterceptor

  • 拦截对带注释的方法的调用。

  • 执行流程:

    1. 记录启动事件 (LOG.infof("INIT: …"))
    2. 调用 monitorSystem.startPerfmon()
    3. 继续执行 context.proceed()
    4. finally 块中:
      • 调用 monitorSystem.generateReportPerfmon(...)
      • 调用 monitorSystem.stopPerfmon()
      • 记录结束事件及执行时间
  • 确保即使抛出异常,监控也始终结束。

2.3 DAO Bean:MonitorSystem

  • 带有 @ApplicationScoped 注释的 CDI bean。

  • 保存启动时初始化的 IRIS 的单个实例。

  • 通过 @ConfigProperty 注入的配置(JDBC URL、用户、密码)。

  • 使用 DriverManager.getConnection(...) 获得原始 IRISConnection

  • 包含方法:

    • startPerfmon()
    • generateReportPerfmon(String reportName)
    • stopPerfmon()
  • 每一个都通过 iris.classMethodVoid(...) 调用 iris.src.dc.AdapterPerfmonProc 中合适的 ObjectScript 方法。

2.4 ObjectScript 适配器:iris.src.dc.AdapterPerfmonProc

  • 定义封装 ^PERFMON 逻辑的例程:

      Class iris.src.dc.AdapterPerfmonProc Extends %RegisteredObject
      {
          ClassMethod start() As %Status
          {
              Set namespace = $NAMESPACE
              zn "%SYS"
              set status = $$Stop^PERFMON()
              set status = $$Start^PERFMON()
              zn namespace
              return status
          }
    
          ClassMethod generateReport(nameReport As %String = "report.txt") As %Status
          {
              Set namespace = $NAMESPACE
              zn "%SYS"
              Set tempDirectory = ##class(%SYS.System).TempDirectory()
              set status = $$Report^PERFMON("R","R","P", tempDirectory_"/"_nameReport)
              zn namespace
    
              return status
          }
    
          ClassMethod stop() As %Status
          {
              Set namespace = $NAMESPACE
              zn "%SYS"
              Set status = $$Stop^PERFMON()
              zn namespace
    
              return status
          }
      }
    
  • 在命名空间 %SYS 中运行以访问 ^PERFMON 例程,然后返回到原始命名空间。


3. 执行流程

  1. 一个请求进入 Quarkus 应用程序。

  2. CDI 拦截器检测 @PerfmonReport 注释并拦截方法调用。

  3. monitorSystem.startPerfmon() is invoked, triggering IRIS ^PERFMON monitoring.

  4. 业务方法正常执行(数据访问、转换、逻辑等)。

  5. 在方法返回或抛出异常后,拦截器确保:

    • 调用 monitorSystem.generateReportPerfmon(...) 以创建 .txt 性能报告。
    • 执行 monitorSystem.stopPerfmon() 以停止监控会话。
    • 使用 Logger.infof(...) 记录 Java 端的总执行时间。
  6. 生成的报告文件存储在 IRIS 临时目录中,通常为:/usr/irissys/mgr/Temp/

    • 文件名遵循以下模式: <ClassName><MethodName><timestamp>.txt

4. 技术挑战和解决方案

挑战解决方案
在使用池化 JDBC 连接时出现 ClassCastException使用 DriverManager.getConnection(...) 获得原生 IRISConnection 而非池化 ConnectionWrapper
反复打开连接产生的开销@ApplicationScoped bean 中维护单个 IRIS 实例,通过 @PostConstruct 初始化。
确保即使在出现异常时 ^PERFMON 也始终停止在拦截器中使用 try-finally 来调用 stopPerfmon()generateReportPerfmon()
配置可移植性使用 @ConfigPropertyapplication.properties 注入连接设置(jdbc.urlusernamepassword
管理并发监控会话避免对高度并发的端点添加注释。 以后的版本可能会实现会话级隔离。

5. 用例和优势

  • 可以从 Java 代码实时查看 IRIS 运行时活动。
  • 为开发者简化了性能分析查询优化工作。
  • 基准测试分析系统回归测试很有用。
  • 可以作为关键操作的轻量级性能审核跟踪

6. 实际使用示例

请在以下位置查看完整的源代码和部署设置:


6.1 概述

该应用程序运行一个 Quarkus 服务器,后者连接到使用 FHIRSERVER 命名空间配置的 InterSystems IRIS 实例
ORM 层使用带 PanacheRepository 的 Hibernate ORM 实现,允许在 Java 实体与 IRIS 数据库类之间直接映射。

当应用程序(通过 docker-compose up)启动时,它会打开:

  • IRIS 容器,托管 FHIR 数据模型和 ObjectScript 例程(包括 AdapterPerfmonProc);
  • Quarkus 容器,公开 REST 端点并通过原生 JDBC 驱动程序连接到 IRIS。

6.2 REST 端点

REST 资源会公开一个简单的端点来检索患者信息:

@Path("/patient")
public class PatientResource {

    @Inject
    PatientService patientService;

    @GET
    @Path("/info")
    @Produces(MediaType.APPLICATION_JSON)
    public PatientInfoDTO searchPatientInfo(@QueryParam("key") String key) {
        return patientService.patientGetInfo(key);
    }
}

此端点接受一个查询参数(密钥),该参数标识了 FHIR 数据仓库中的患者资源。


### 6.3 带有 @PerfmonReport 的服务层

PatientService 类包含用于检索和撰写患者信息的业务逻辑。 它带有 @PerfmonReport 注释,这意味着对 /pantion/info 的每个请求都会触发 IRIS 性能监控:

@ApplicationScoped
public class PatientService {

    @Inject
    PatientRepository patientRepository;

    @PerfmonReport
    public PatientInfoDTO patientGetInfo(String patientKey) {

        Optional<Patient> patientOpt = patientRepository.find("key", patientKey).firstResultOptional();
        Patient patient = patientOpt.orElseThrow(() -> new IllegalArgumentException("Patient not found"));

        PatientInfoDTO dto = new PatientInfoDTO();
        dto.setKey(patient.key);
        dto.setName(patient.name);
        dto.setAddress(patient.address);
        dto.setBirthDate(patient.birthDate != null ? patient.birthDate.toString() : null);
        dto.setGender(patient.gender);
        dto.setMedications(patientRepository.findMedicationTextByPatient(patientKey));
        dto.setConditions(patientRepository.findConditionsByPatient(patientKey));
        dto.setAllergies(patientRepository.findAllergyByPatient(patientKey));

        return dto;
    }
}

6.4 执行流程

GET /patient/info?key=Patient/4 提出请求

Quarkus 将请求路由到 PatientResource.searchPatientInfo()

CDI 拦截器在 PatientService.patientGetInfo() 中检测 @PerfmonReport 注释。

在执行服务逻辑前:

  • 拦截器调用 MonitorSystem.startPerfmon(),这会调用 IRIS 类 iris.src.dc.AdapterPerfmonProc.start()

  • 方法执行业务逻辑,使用 Hibernate PanacheRepository 映射查询患者数据。

在方法完成后:

  • 调用 MonitorSystem.generateReportPerfmon() 以创建性能报告。

  • MonitorSystem.stopPerfmon() 停止 IRIS 性能监视器。

usr/irissys/mgr/Temp/ 下生成一个 .txt 报告

示例文件名:PatientService_patientGetInfo_20251005_161906.txt

6.5 结果

生成的报告包含详细的 IRIS 运行时统计信息,例如:

                         Routine Activity by Routine

Started: 10/11/2025 05:07:30PM                    Collected: 10/11/2025 05:07:31PM

Routine Name                        RtnLines  % Lines   RtnLoads  RtnFetch  Line/Load Directory
----------------------------------- --------- --------- --------- --------- --------- ---------
Other                                     0.0       0.0       0.0       0.0         0
PERFMON                                  44.0       0.0       0.0       0.0         0 /usr/irissys/mgr/
%occLibrary                         3415047.0      34.1   48278.0       0.0      70.7 /usr/irissys/mgr/irislib/
iris.src.dc.AdapterPerfmonProc.1          7.0       0.0       2.0       0.0       3.5 /usr/irissys/mgr/FHIRSERVER/
%occName                            5079994.0      50.7       0.0       0.0         0 /usr/irissys/mgr/irislib/
%apiDDL2                            1078497.0      10.8   63358.0       0.0      17.0 /usr/irissys/mgr/irislib/
%SQL.FeatureGetter.1                 446710.0       4.5   66939.0       0.0       6.7 /usr/irissys/mgr/irislib/
%SYS.WorkQueueMgr                       365.0       0.0       1.0       0.0     365.0 /usr/irissys/mgr/
%CSP.Daemon.1                            16.0       0.0       1.0       0.0      16.0 /usr/irissys/mgr/irislib/
%SYS.TokenAuth.1                         14.0       0.0       5.0       0.0       2.8 /usr/irissys/mgr/
%Library.PosixTime.1                      2.0       0.0       0.0       0.0         0 /usr/irissys/mgr/irislib/
%SYS.sqlcq.uEXTg3QR7a7I7Osf9e8Bz...      52.0       0.0       1.0       0.0      52.0 /usr/irissys/mgr/
%SYS.SQLSRV                              16.0       0.0       0.0       0.0         0 /usr/irissys/mgr/
%apiOBJ                                 756.0       0.0       0.0       0.0         0 /usr/irissys/mgr/irislib/
FT.Collector.1                            0.0       0.0       0.0       0.0         0 /usr/irissys/mgr/
SYS.Monitor.FeatureTrackerSensor.1        0.0       0.0       0.0       0.0         0 /usr/irissys/mgr/
%SYS.Monitor.Control.1                    0.0       0.0       0.0       0.0         0 /usr/irissys/mgr/
%SYS.DBSRV.1                            252.0       0.0       4.0       0.0      63.0 /usr/irissys/mgr/
%sqlcq.FHIRSERVER.cls12.1                19.0       0.0       0.0       0.0         0 /usr/irissys/mgr/irislocaldata/
%sqlcq.FHIRSERVER.cls13.1                74.0       0.0       0.0       0.0         0 /usr/irissys/mgr/irislocaldata/
%sqlcq.FHIRSERVER.cls14.1                74.0       0.0       0.0       0.0         0 /usr/irissys/mgr/irislocaldata/
%sqlcq.FHIRSERVER.cls15.1                52.0       0.0       0.0       0.0         0 /usr/irissys/mgr/irislocaldata/
%SYS.System.1                             1.0       0.0       0.0       0.0         0 /usr/irissys/mgr/

通过这些数据,可以精确了解 IRIS 在 REST 调用期间内部执行了哪些例程 — 包括 SQL 编译、执行和 FHIR 数据访问。

洞察%sqlcq.FHIRSERVER.* 例程会捕获 Quarkus 在该方法中执行的所有 SQL 缓存查询。 监控这些例程可以让开发者分析查询执行情况、了解代码行为并发现潜在的性能瓶颈。 这使它们成为开发和调试 FHIR 相关操作的强大工具。

image

6.6 总结

此示例演示了标准 Quarkus 服务如何使用 @PerfmonReport 注释以透明的方式利用 IRIS 原生监控工具。 它结合了:

  • CDI 拦截器 (Quarkus)

  • Hibernate PanacheRepositories (ORM)

  • IRIS 原生 ObjectScript 例程 (^PERFMON)

结果是产生了一种完全自动化、可重现的性能分析机制,这种机制可以应用于应用程序中的任何服务方法。

0
0 11
文章 Lele Yang · 七月 22, 2021 6m read

提示:本文包含在Java中通过JDBC Driver对Caché/IRIS数据库进行查询的示例代码。

近期有客户反应使用Java从老版本Caché中读取数据时,如果数据中包含long varchar, Caché数据库中与之对应的属性类型为%Stream.GlobalCharacter,即使实际上该流数据长度非常小,也会成十几倍的降低性能。

大家先来看一段代码, 

3
0 281
文章 姚 鑫 · 二月 17, 2025 2m read

第二十七章 S 开头的术语

存储接口 (storage interface)

对象(Objects)

使用自定义存储或编写自己的存储类时必须实现的一组方法。

存储策略 (storage strategy)

对象(Objects)

类使用的存储策略在编译时评估为存储定义,决定数据的存储方式。

存储过程 (stored procedure)

SQL

存储过程允许你从 ODBCJDBC 执行查询或类方法。

流接口 (stream interface)

对象(Objects)

IRIS 流接口用于在 ObjectScriptSQLJava 中操作流。

流 (stream)

对象(Objects)

流提供了一个接口,用于操作和存储大量数据。IRIS 流接口可在 ObjectScriptSQLJava 中用于操作流。

超级服务器 (superserver)

系统

监听指定端口的服务器,用于接收对 IRIS 的传入连接并将其分发到适当的子系统。默认的超级服务器端口是 1972;如果 1972 不可用,超级服务器将从 51773 开始监听下一个可用端口。要设置超级服务器端口号,请使用管理门户(系统管理 > 配置 > 系统配置 > 内存和启动)中的内存和启动页面的超级服务器端口号字段。

滑动 (swizzling)

对象(Objects)

当嵌入和持久对象被引用时,自动将其拉入内存的过程。也称为懒加载。

系统类 (system class)

对象(Objects)

IRIS 提供内置功能的类。

系统配置 (system configuration)

系统

IRIS 启动时使用的系统资源定义。你通过管理门户定义系统配置。

系统管理员目录 (system manager’s directory)

系统

IRIS 数据库所在的目录,包含 IRIS 系统全局、系统例程以及用于 IRIS 管理器和 % 实用工具的例程。它是 IRIS 安装目录中的 MGR 子目录。

系统名称 (system name)

系统

分配给网络中节点的名称。必须在网络中唯一。也称为主机名或计算机名。在命名空间/网络配置编辑器中用于标识网络配置中的计算机。MNET 实用工具中称为目录集。

系统进程 (system processes)

系统

Windows - 在 Windows 上,无法调整进程的优先级。 UNIX® - 在 UNIX® 上,优先级由 nice 值控制。通过提高进程的 nice 值,给予其较低的优先级;通过降低 nice 值,给予进程较高的优先级。

0
0 90
文章 Michael Lei · 九月 18, 2023 6m read

如今,关于大语言模型、人工智能等的消息不绝于耳。向量数据库是其中的一部分,并且已经有非IRIS的技术实现了向量数据库。

为什么是向量?

  • 相似性搜索:向量可以进行高效的相似性搜索,例如在数据集中查找最相似的项目或文档。传统的关系数据库是为精确匹配搜索而设计的,不适合图像或文本相似性搜索等任务。
  • 灵活性:向量表示形式用途广泛,可以从各种数据类型派生,例如文本(通过 Word2Vec、BERT 等嵌入)、图像(通过深度学习模型)等。
  • 跨模态搜索:向量可以跨不同数据模态进行搜索。例如,给定图像的向量表示,人们可以在多模式数据库中搜索相似的图像或相关文本。

还有许多其他原因。

因此,对于这次 pyhon 竞赛,我决定尝试实现这种支持。不幸的是我没能及时完成它,下面我将解释原因。

0
0 161
文章 Jingwei Wang · 五月 5, 2023 3m read

WIN SQL是大多数用户使用的普通编辑器。但是我们不能使用winsql下载大量数据。所以我写了一个教程如何连接一个新的基于 Java 的编辑器,叫做 Squirrel SQL,它可以很容易地下载或导出 excel 或任何其他格式的数据。我还包括一个 Java JCBC 连接程序来连接 IRIS 数据库,尤其是镜像/故障转移服务器。

基于 SQL Java 的编辑器导出大量数据和用于 IRIS 连接的 Java JDBC 程序

基于 SQL Java 的编辑器导出大量数据

WinSql 是通常用于从 Iris 数据库中提取数据的编辑器,但是,如果没有许可的 winsql,则无法导出大量数据。

解决方案是使用基于 java 的编辑器,称为 Squirrel SQL。这是一个基于 java 的编辑器,您可以在从 IRIS 数据库执行 fetch 从编辑器中导出大量数据。这是用 Java 构建的开源 SQL 客户端,它使用 JDBC 连接到 IRIS 数据库。

Squirrel SQL 的特点

  • Java 19 兼容性
  • 多个插入符/光标编辑
  • 全局首选项和新会话属性搜索
  • Saved Sessions 的多项改进(用于保存和恢复 Session 的所有 SQL 编辑器的特性)
  • 可配置的鼠标右键菜单
  • 重新设计的添加/编辑 JDBC 驱动程序对话框

安装 Squirrel SQL 的步骤

0
0 651
文章 王喆 👀 · 三月 12, 2023 8m read

SSH框架是Java一个的比较有代表性的框架,是多年前比较流行的一个。有struts+spring+hibernatespringMVC+spring+hibernate两种,当然我大学时候使用的是第二种。倘使我能把IRIS作为一个库,联结到Hibernate那么理论上是不是也代表IRIS也可以使用SSH框架开发呢?

工具及环境

JDK 1.8

       Maven

       Hibernate 5.X.X

       IRISHealth-2022.1.3

       intellij idea

       Windows 10 64

1、创建数据库

       用代码的方式创建几个表

Class BKIP.SOA.MonitorScreen.CacheTable.logError Extends %Persistent

{

/// 服务概况缓存表

Property SucNum As %String(MAXLEN = "");

Property failNum As %String(MAXLEN = "");

Property fdateTime As %String(MAXLEN = "");

}

如图所示:

2、创建一个Spring的项目

       File—New—Project....

next

给项目起名,选择jdk版本

Next

0
0 134
文章 Lele Yang · 六月 23, 2021 3m read

Production是指Ensemble/HealthShare Health Connect/IRIS/IRIS for Health产品中提供的互操作功能模块,更多关于Production介绍,可参见在线文档,
https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=AFL_productions#AFL_productions_quicklook

Production中访问外部数据库常用的适配器Adapter有两个,一个是用于Business Service中的Enslib.SQL.InboundAdapter,另一个是用于Business Operation中的Enslib.SQL.OutboundAdapter,
更多关于这两个Adapter的使用说明可以参见在线文档"Using SQL Adapters in Productions",

本文主要涵盖以下内容

1. 基本配置步骤(仅涉及与JDBC连接相关配置)
2. JDBC Gateway和Java Gateway Service的区别
3. 常见的问题类型
4. 常用基本故障排查

基本配置步骤

2
0 261
文章 Jiakeng Lei · 四月 22, 2022 1m read

问题: 通过JDBC连接Oracle19C数据报错 "ORA-28040: No matching authentication protocal"

解决 : 1、在数据库服务器上找到sqlnet.ora文件,一般在oracle安装目录app/oracle/product/19.0.0.0/db_1/network/admin/sqlnet.ora

2、如果有进行修改,没有直接创建

3、slqnet.ora文件新增或修改以下 SQLNET.ALLOWED_LOGON_VERSION_SERVER=8 SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8

4、注意事项: ① 如果没有sqlnet.ora文件可以直接创建 vi sqlnet.ora ② 如果有不能直接vi 需要使sed -a 命令追加,否则会导致ora文件乱码 ③ 添加参数后新无需重启数据库或者监听,但是需要修改用户密码,否则会报错

5、修改用户名密码

sqlplus / as sysdba

alter user 用户名 identified by 新密码;

2
0 326
问题 liu yangyang · 三月 29, 2022

主要问题: 默认安装后,有没有默认用户名,密码?远程jdbc连接报错,麻烦解答一下,谢谢 [InterSystems IRIS JDBC] Communication link failure: Access Denied [08S01][461] Access Denied

创建用户: addgroup iris useradd -g iris -d "/home/iris" -m -s "/bin/bash" iris passwd iris

安装过程: root@baec-ThinkPad-E480:/data/IRIS_Community-2021.2.0.651.0-lnxubuntu1804x64# ./irisinstall

Your system type is 'Ubuntu LTS (x64)'.

Enter instance name <IRIS>: IRIS

Enter a destination directory for the new instance. Directory: /data

Select installation type. 1) Development - Install InterSystems IRIS server and all language bindings 2) Server only - Install InterSystems IRIS server 3) Custom Setup type <1>?

How restrictive do you want the initial Security settings to be? "Minimal" is the least restrictive, "Locked Down" is the most secure. 1) Minimal 2) Normal 3) Locked Down Initial Security settings <1>?

What group should be allowed to start and stop this instance? iris

Do you want to install IRIS Unicode support <Yes>?

InterSystems IRIS did not detect a license key file

Do you want to enter a license key <No>? no

Please review the installation options:

Instance name: IRIS Destination directory: /data InterSystems IRIS version to install: 2021.2.0.651.0com Installation type: Development Unicode support: Y Initial Security settings: Minimal User who owns instance: root Group allowed to start and stop instance: iris Effective group for InterSystems IRIS processes: irisusr Effective user for InterSystems IRIS SuperServer: irisusr SuperServer port: 1972 WebServer port: 52773 JDBC Gateway port: 53773 Web Gateway: using built-in web server Not installing IntegratedML

Confirm InterSystems IRIS installation <Yes>?

Starting installation Starting up InterSystems IRIS for loading... ../bin/irisinstall -s . -B -c c -C /data/iris.cpf*IRIS -W 1 -g2 Starting Control Process Allocated 254MB shared memory: 32MB global buffers, 80MB routine buffers Creating a WIJ file to hold 32 megabytes of data IRIS startup successful. System locale setting is 'zh_CN.UTF-8' This copy of InterSystems IRIS has been licensed for use exclusively by: InterSystems IRIS Community Copyright (c) 1986-2022 by InterSystems Corporation Any other use is a violation of your license agreement

^^/data/mgr/>

^^/data/mgr/> Start of IRIS initialization Loading system routines Updating system TEMP and LOCALDATA databases Installing National Language support

Setting IRISTEMP default collation to IRIS standard (5) Loading system classes Updating Security database Loading system source code Building system indices Updating Audit database Updating Journal directory Updating User database Updating Interoperability databases Scheduling inventory scan IRIS initialization complete

See the iboot.log file for a record of the installation.

Starting up InterSystems IRIS... Once this completes, users may access InterSystems IRIS Starting IRIS Using 'iris.cpf' configuration file

Starting Control Process Global buffer setting requires attention. Auto-selected 25% of total memory. Allocated 2420MB shared memory: 1965MB global buffers, 196MB routine buffers Creating a WIJ file to hold 99 megabytes of data This copy of InterSystems IRIS has been licensed for use exclusively by: InterSystems IRIS Community Copyright (c) 1986-2022 by InterSystems Corporation Any other use is a violation of your license agreement

You can point your browser to http://baec-ThinkPad-E480:52773/csp/sys/UtilHome.csp to access the management portal.

Installation completed successfully

启动实例: root@baec-ThinkPad-E480:/data# iris start iris IRIS is already up!

查看信息: root@baec-ThinkPad-E480:/data# iris list

Configuration 'IRIS' (default) directory: /data versionid: 2021.2.0.651.0com datadir: /data conf file: iris.cpf (SuperServer port = 1972, WebServer = 52773) status: running, since Tue Mar 29 17:00:13 2022 state: ok product: InterSystems IRIS

连接信息: ip:x.x.x.x 端口:1972 指定数据库:user 用户:_SYSTEM 密码:system

连接报错信息: 指定的数据库用户/密码组合被拒: [08S01][461] [InterSystems IRIS JDBC] Communication link failure: Access Denied [08S01][461] Access Denied

1
0 688
文章 Botai Zhang · 一月 26, 2021 3m read

利用Intersystems IRIS医疗版数据平台内置多模型整合

医院信息查询业务解决方案

概述:

随着医院信息化建设的逐步完善医院子系统越来越多,系统间接口越来越多,同时接口费用不断增加,管理工作变得越来越复杂。其中,查询类业务接口根据业务类型分化,数量也是逐步递增,带来接口量大、开发工作繁重、代码冗余、维护困难等等问题。针对这一困境,我们利用Intersystems IRIS数据平台内置多模型整合医院信息查询业务解决方案。该应用程序可通过内置模型应用完成查询业务,大大缩小开发、维护、实施等项目关键运转周期。

应用链接:HealthInfoQueryLayer           

关键应用:IRIS for Health、REST APIObjectScriptGlobals SQL、DATA LOOKUP TABLES

应用程序采用模型及应用介绍:

1.采用模型

1.1. Globals (key-value)

Globals是可以在IRIS数据库中存储和管理的稀疏多维数组。您可以使用ObjectScript和本机API处理Globals

工具:

https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=GGBL_MANAGING

应用:

2
0 484
文章 Michael Lei · 五月 8, 2021 8m read

关键字:Python,JDBC,SQL,IRIS,Jupyter Notebook,Pandas,Numpy ,机器学习 

1. 目的

这是一个用于演示的 5 分钟快速笔记,通过 Jupyter Notebook 中的 Python 3 调用 IRIS JDBC 驱动程序,以经由 SQL 语法从 IRIS 数据库实例读取数据和向 IRIS 数据库实例写入数据。 

去年,我发表了关于将 Python 绑定到 Cache 数据库的简要笔记(第 4.7 节)。 如何使用 Python 挂入 IRIS 数据库以将其数据读入 Pandas 数据框和 NumPy 数组进行常规分析,然后再将一些经过预处理或标准化的数据写回 IRIS 中,准备进一步用于 ML/DL 管道,现在可能是时候回顾一些选项和讨论了。

一些立即浮现的快速选项

  1.    ODBC:Python 3 和原生 SQL 的 PyODBC?
  2.    JDBC:Pyhton 3 和原生 SQL 的 JayDeBeApi?
  3.    Spark:PySpark 和 SQL?
  4.    Python Native API for IRIS:超越先前的 Python Binding for Cache?
  5.   ** IPtyhon Magic SQL %%sql**?  可以支持 IRIS 了吗?

 这里有漏掉其他选项吗?  我有兴趣尝试任何选项。 

2. 范围 

我们是不是应该从普通的 JDBC 方法开始? 下一个快速笔记将总结 ODBC、Spark 和 Python Native API。 

范围内:

此快速演示涉及以下常见组件:

  • Anaconda
  • Jupyter Notebook 
  • Python 3
  • JayDeBeApi
  • JPyPe
  • Pandas
  • NumPy
  • 一个 IRIS 2019.x 实例
  •  范围外:

    本快速笔记不会涉及以下内容,但它们也很重要,可以使用特定的站点解决方案、部署和服务单独解决: 

  • 安全端到端。
  • 非功能性能等。
  • 问题排查和支持。
  • 许可。 
  • 3. 演示

    3.1 运行 IRIS 实例:

    我只运行了一个 IRIS 2019.4 容器,作为“远程”数据库服务器。 您可以使用任何您有权利访问的 IRIS 实例。

    zhongli@UKM5530ZHONGLI MINGW64 /c/Program Files/Docker Toolbox
    $ docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                PORTS                                              NAMES
    d86be69a03ab        quickml-demo        "/iris-main"        3 days ago          Up 3 days (healthy)   0.0.0.0:9091->51773/tcp, 0.0.0.0:9092->52773/tcp   quickml

    3.2 Anaconda 和 Jupyter Notebook:

     我们将在笔记本电脑中重用相同的设置方法,这里对应 Anaconda(第 4.1 节),这里对应 Jupyter Notebook(第 4 节)。  Python 3.x 在这一步安装。

    3.3 安装 JayDeBeApi 和 JPyPe:

    启动 JupyterNotebook,然后在其单元格中运行以下内容设置 Python-to-JDBC/Java 桥
     
      !conda install --yes -c conda-forge jaydebeapi

    JayDeBeApi 在撰写本文时(2020 年 1 月)使用 JPype 0.7,该版本由于一个已知错误无法运行,必须降级为 0.6.3

    !conda install --yes -c conda-forge JPype1=0.6.3 --force-reinstall

    3.4 通过 JDBC 连接到 IRIS 数据库 

    这里有一个正式的使用 JDBC 连接到 IRIS 的文档。 

    对于通过 JDBC 执行 Python SQL,我以下面的代码为例。 它连接到此 IRIS 实例的“USER”命名空间内的数据表“DataMining.IrisDataset”。 

    ### 1. Set environment variables, if necessary&lt;br>#import os&lt;br>#os.environ['JAVA_HOME']='C:\Progra~1\Java\jdk1.8.0_241'&lt;br>#os.environ['CLASSPATH'] = 'C:\interSystems\IRIS20194\dev\java\lib\JDK18\intersystems-jdbc-3.0.0.jar'&lt;br>#os.environ['HADOOP_HOME']='C:\hadoop\bin'  #winutil binary must be in Hadoop's Home
    ### 2. Get jdbc connection and cursor&lt;br>&lt;strong>import jaydebeapi&lt;br>url = "jdbc:IRIS://192.168.99.101:9091/USER"&lt;br>driver = 'com.intersystems.jdbc.IRISDriver'&lt;br>user = "SUPERUSER"&lt;br>password = "SYS"&lt;/strong>&lt;br>#libx = "C:/InterSystems/IRIS20194/dev/java/lib/JDK18"&lt;br>&lt;strong>jarfile = "C:/InterSystems/IRIS20194/dev/java/lib/JDK18/intersystems-jdbc-3.0.0.jar"&lt;/strong>
    conn = jaydebeapi.connect(driver, url, [user, password], jarfile)&lt;br>curs = conn.cursor()
    ### 3. specify the source data table&lt;br>&lt;strong>dataTable = 'DataMining.IrisDataset'&lt;/strong>
     
    ### 4. Get the result and display&lt;br>&lt;strong>curs.execute("select TOP 20 * from %s" % dataTable)&lt;br>result = curs.fetchall()&lt;br>print("Total records: " + str(len(result)))&lt;br>for i in range(len(result)):&lt;br>    print(result[i])&lt;/strong>
    ### 5. CLose and clean - I keep them open for next accesses.&lt;br>&lt;strong>#curs.close()&lt;br>#conn.close()&lt;/strong>
    Total records: 150
    (1, 1.4, 0.2, 5.1, 3.5, 'Iris-setosa')
    (2, 1.4, 0.2, 4.9, 3.0, 'Iris-setosa')
    (3, 1.3, 0.2, 4.7, 3.2, 'Iris-setosa')
    ... ...
    (49, 1.5, 0.2, 5.3, 3.7, 'Iris-setosa')
    (50, 1.4, 0.2, 5.0, 3.3, 'Iris-setosa')
    (51, 4.7, 1.4, 7.0, 3.2, 'Iris-versicolor')
    ... ... 
    (145, 5.7, 2.5, 6.7, 3.3, 'Iris-virginica')
    ... ... 
    (148, 5.2, 2.0, 6.5, 3.0, 'Iris-virginica')
    (149, 5.4, 2.3, 6.2, 3.4, 'Iris-virginica')
    (150, 5.1, 1.8, 5.9, 3.0, 'Iris-virginica')

     

    测试表明 JDBC 上的 Python 可以正常运行。 以下只是常规 ML 管道的一些常规数据分析和预处理,由于我们可能会在后续的演示和比较中反复涉及,因此为方便起见在这里附上。 

    3.5 将 SQL 结果转换为 Pandas DataFrame,再转换为 NumPy 数组

    如果还没有安装 Pandas 和 NumPy 软件包,可以通过 Conda 安装,类似于上面 3.3 节。

    然后运行以下示例:

    ### transform SQL results "sqlData"to Pandas dataframe "df", then further to NumPy array "arrayN" for further ML pipelines 
    import pandas as pd
    sqlData = "SELECT * from DataMining.IrisDataset"
    df= pd.io.sql.read_sql(sqlData, conn)
    df = df.drop('ID', 1)
    df = df[['SepalLength', 'SepalWidth', 'PetalLength', 'PetalWidth', 'Species']]
    # set the labels to 0, 1, 2, for NumPy matrix
    df.replace('Iris-setosa', 0, inplace=True)
    df.replace('Iris-versicolor', 1, inplace=True)
    df.replace('Iris-virginica', 2, inplace=True)
    # turn dataframe into Numpy array
    arrayN = df.to_numpy()
    ### 6. CLose and clean - if connection is not needed anymore?
    #curs.close()
    #conn.close()

    我们例行查看一下当前数据:

    df.head(5)

    df.describe()

    现在,我们得到了一个 DataFrame,以及一个来自源数据表的标准化 NumPy 数组。  

    当然,我们在这里可以尝试各种常规分析,一个 ML 人员会按照下述步骤开始,在 Python 中替换 R(链接)。

    数据源引自此处

    3.6 拆分数据并通过 SQL 写回 IRIS 数据库:

    当然,我们可以像往常一样将数据拆分为训练集和验证集或测试集,然后将它们写回临时数据库表,实现 IRIS 一些即将推出的精彩 ML 功能:

    import numpy as np 
    from matplotlib import pyplot
    from sklearn.model_selection import train_test_split
    # keep e.g. 20% = 30 rows as test data; trained on another e.g. 80% = 120 rows
    X = arrayN[:,0:4]
    y = arrayN[:,4]
    X_train, X_validation, Y_train, Y_validation = train_test_split(X, y, test_size=0.20, random_state=1, shuffle=True)
    # make 80% of random rows into a Train set
    labels1 = np.reshape(Y_train,(120,1))
    train = np.concatenate([X_train, labels1],axis=-1)
    # make 20% of left rows into Test set
    lTest1 = np.reshape(Y_validation,(30,1))
    test = np.concatenate([X_validation, lTest1],axis=-1)
    # write the train data set into a Pandas frame
    dfTrain = pd.DataFrame({'SepalLength':train[:, 0], 'SepalWidth':train[:, 1], 'PetalLength':train[:, 2], 'PetalWidth':train[:, 3], 'Species':train[:, 4]})
    dfTrain['Species'].replace(0, 'Iris-setosa', inplace=True)
    dfTrain['Species'].replace(1, 'Iris-versicolor', inplace=True)
    dfTrain['Species'].replace(2, 'Iris-virginica', inplace=True)
    # write the test data into another Pandas frame
    dfTest = pd.DataFrame({'SepalLength':test[:, 0], 'SepalWidth':test[:, 1], 'PetalLength':test[:, 2], 'PetalWidth':test[:, 3], 'Species':test[:, 4]})
    dfTest['Species'].replace(0, 'Iris-setosa', inplace=True)
    dfTest['Species'].replace(1, 'Iris-versicolor', inplace=True)
    dfTest['Species'].replace(2, 'Iris-virginica', inplace=True)
    ### 3. specify temp table names
    #dataTable = 'DataMining.IrisDataset'
    dtTrain = 'TRAIN02'
    dtTest = "TEST02"
    ### 4. Create 2 temporary tables - you can try drop tables then re-create them every time
    curs.execute("Create Table %s (%s DOUBLE, %s DOUBLE, %s DOUBLE, %s DOUBLE, %s VARCHAR(100))" % (dtTrain, dfTrain.columns[0], dfTrain.columns[1], dfTrain.columns[2], dfTrain.columns[3], dfTrain.columns[4]))
    curs.execute("Create Table %s (%s DOUBLE, %s DOUBLE, %s DOUBLE, %s DOUBLE, %s VARCHAR(100))" % (dtTest, dfTest.columns[0], dfTest.columns[1], dfTest.columns[2], dfTest.columns[3], dfTest.columns[4]))
    ### 5. write Train set and Test set into the tales. You can try to delete old record then insert everytime. 
    curs.fast_executemany = True
    curs.executemany( "INSERT INTO %s (SepalLength, SepalWidth, PetalLength, PetalWidth, Species) VALUES (?, ?, ?, ? ,?)" % dtTrain,
         list(dfTrain.itertuples(index=False, name=None)) )
    curs.executemany( "INSERT INTO %s (SepalLength, SepalWidth, PetalLength, PetalWidth, Species) VALUES (?, ?, ?, ? ,?)" % dtTest,
         list(dfTest.itertuples(index=False, name=None)) )
    ### 6. CLose and clean - if connection is not needed anymore?
    #curs.close()
    #conn.close()

    现在,如果切换到 IRIS 管理控制台或终端 SQL 控制台,应该看到已创建 2 个临时表:120 行的 TRAIN02 和 30 行的 TEST02。

    那么本篇快速笔记到这里就结束了。

    4. 注意事项

    • 以上内容可能会被更改或完善。 

    5. 未来计划

    我们将使用 IRIS 的 PyODBC、PySPark 和 Python Native API 替换第 3.3 和 3.4 节。除非有人愿意帮忙编写一篇快速笔记,我也将对此不胜感激。

    0
    0 477
    文章 Claire Zheng · 一月 20, 2021 15m read

    跨行业用例大多要求具备每秒接收数千或数百万条记录的能力,同时能够支持实时同步查询,例如:股票交易处理、欺诈检测、物联网应用(包括异常检测和实时OEE监控)等。Gartner将这种能力称为“HTAP”(混合事务分析处理)。Forrester等其他公司将其称为Translytics。InterSystems IRIS是功能强大、可扩展、高性能、资源高效的事务分析型数据平台,同时具备内存数据库的高性能以及传统数据库的一致性、可用性、可靠性以及低成本的特性。

    0
    0 372