请参考文档:https://docs.intersystems.com/irisforhealth20231/csp/docbook/Doc.View.cl... 提供更多ODBC 日志以供错误排查。

也可以在菜单中选择系统操作 -- 系统日志 -- xDBC错误日志查看。

还可以尝试使用其他三方ODBC工具,同样加载该odbc驱动,看是否报错。

建议在Unix上使用JDBCGateway,因为目前只有iODBC支持Unicode

下面是示例代码使用JDBCGateway

#dim %JDBCGateway As %Net.Remote.Java.JDBCGateway
 set conn = $system.SQLGateway.GetJDBCConnection("TestConn")
 if (conn = "") quit 0
 set cmd = "select c1,c2,c3 from wrc943403 where c1 = ?"
 set st = %JDBCGateway.prepareStatement(conn, cmd)
 do %JDBCGateway.setString(st,1,9) // assign c1 to 9
 set res = %JDBCGateway.execQuery(st)
 if (res) {
   set error = %JDBCGateway.getErrorText()
   write "error = ",error,!
   quit
 }
 while %JDBCGateway.next(st) {
   set c1 = %JDBCGateway.getString(st,1)
   set c2 = %JDBCGateway.getString(st,2)
   write "c1=",c1,!
   write "c2=",c2,!
 }
 write $system.SQLGateway.DropConnection("TestConn")
 quit

可以试试在Mirror配置里面选中使用传输的压缩模式,具体文档看这里

也就是从主机传输到备机、异步镜像成员的内容是压缩后的,这样可以大大较少网络占用。

还有建议将Mirror镜像成员之间传输数据使用的网络和使用数据的外部应用网络区分开,如果使用了ECP配置更加需要注意,如下图区分了1.给用户和其他系统接入使用的网络。2.为ECP通讯使用的私有网以及3.为Mirror通讯的私有网:

Mirror members are on one private LAN, app servers on another for the mirror and on a campus network for external connections

更多Mirror架构以及网络配置建议可以参考官方文档,这里

使用Python Binding,参见文档 https://cedocs.intersystems.com/ens20162/csp/docbook/DocBook.UI.Page.cls?KEY=GBPY_intro

    例如一些基本的操作:

    • 创建数据库连接
         conn = intersys.pythonbind.connection()
         conn.connect_now(url,user,password, None)
         database = intersys.pythonbind.database(conn)
    • 打开存在的对象
         person =  database.openid("Sample.Person",str(id),-1,-1)
    • 创建新的对象
         person =  database.create_new("Sample.Person", None)
    • 设置对象属性或者取值
         person.set("Name","Doe, Joe A")
         name = person.get("Name")
    • 运行一个方法
         answer = person.run_obj_method("Addition",[17,20])
    • 保存对象
         person.run_obj_method("%Save",[])
    • 获取保存对象的id 
         id = person.run_obj_method("%Id",[])
    • 执行一个查询 
         sqlstring ="SELECT ID, Name, DOB, SSN \
                     FROM SAMPLE.PERSON \
                     WHERE Name %STARTSWITH ?"
         query = intersys.pythonbind.query(database)
         query.prepare(sqlstring)
         query.set_par(1,"A")
         query.execute();
         while 1:
            cols = query.fetch([None])
            if len(cols) == 0: break
            print cols

    同时可以在安装目录的/dev/Python/samples/ 下查看更多例子,比如

    • CPTest6.py — Process the result set of a ByName query.
    • CPTest7.py — Process the result set of a dynamic SQL query.

    Message Router的主要功能是消息路由,可以根据传递消息的不同内容将消息发送给不同的目标。

    它不能用于监视task schedule任务执行的情况。

    如果要通过代码监视任务执行情况可以:

     set rs=##class(%ResultSet).%New("%SYS.Task.History:TaskHistoryForDay")
     set startH=$ZDH("02/01/2017")
     set endH=$ZDH("02/28/2017")
     do rs.Execute(startH,endH)
     ;do rs.Execute()     ;; or take all hisotries
     while rs.Next() {
      write rs.Get("Task Name"),":",rs.Get("Result"),!
     }

    试试扩展函数,里面使用%Ensemble获取,同时还有%System中可以获取更多系统信息。

    再在rule中使用这个扩展函数。

    Class utils.functions Extends Ens.Rule.FunctionSet
    {
    
    ClassMethod GetSess()
    {
    	s s=%Ensemble("SessionId")
    	&SQL(Select SourceConfigName into :sess from Ens.MessageHeader where ID=:s)
    	Quit sess
    }
    }

    既然是再研究,何不试试我们最新的InterSystems IRIS。如果以前研究过Caché 会发现,IRIS 还是同样的架构、同样的开发语言、同样的global存储,只是人机交互更流畅、性能更快,增加更多扩展,机器学习、python、丰富的外部BI工具适配、容器化部署、API管理等等等等,都等着你探索。

    要想体验就在社区主页左边,选择下载InterSystems IRIS。

    WRC可以说是我们对客户的支持中心,所以只面对我们的客户开放注册。

    不知道你在哪里找文档找了一个星期,可以直接去docs.intersytems.com,选择你要对应的版本,然后再查找框里输入jdbc url, 比如我在最新的InterSystems IRIS for health 2021.2的文档中查到:

    jdbc:IRIS://<host>:<port>/<namespace>/<logfile>:<eventclass>:<nodelay>:<ssl>

    比如:

    jdbc:IRIS://127.0.0.1:1972/User

    原文在这里:https://docs.intersystems.com/irisforhealth20212/csp/docbook/DocBook.UI.Page.cls?KEY=BJAVA_connecting#BJAVA_connecting_url

    我们推荐的高可用性方案是Mirror。也就是配置至少主备两个镜像成员+灾备异步镜像成员,可选配置多个异步报表镜像成员以及多个灾备异步镜像成员。

    当然同时推荐的是建立健全的外部备机机制,以及使用外部备份进行恢复的演练,手动升级灾备异步镜像成员为主机的演练。

    对于大型应用一般使用ECP创建多台应用服务器,进行多用户的负载分配,再将多台应用服务器连接至数据服务器,数据服务器进行高可用性配置。

    Production 重启的过程包括了关闭Production和启动Production。

    关闭Production的过程需要把所有活动Job中的消息放入队列中,这个过程如果发生在业务量非常大的时候,也就是job非常多,每个job中的待处理消息很多的时候会花费很长时间。

    而启动Production的过程会逆向关闭的过程,恢复关闭前的job以及的消息,同样这个时间与关闭production前业务繁忙、队列的大小有关。

    当关闭的时间过长,会提示是否需要“强制”关闭production,如果强制关闭,后果就是无法保证恢复关闭production前的业务。

    如果想等待或设置较长的等待时间,可以在terminal中执行 Ens.Director 类的StopProduction函数:

    ClassMethod StopProduction(pTimeout As %Numeric = 10, pForce As %Boolean = 0) As %Status

    第一个参数设置超时时间,第二个参数设置是否强制关闭。

    不知道你问题里的日志是不是指的journal文件。

    没有直接读取journal的方法,只有类似MirrorDejournal的方法对写入异步镜像成员的journal进行操作,

    比如将内容写入到你自己的一个数据global中。

    在写journal的同时将journal中记录的内容存放在另一个地方。

    具体做法可以参考社区里的另一篇文章:CDC系列之一 :使用Dejournal Filter在InterSystems IRIS/Caché上通过Mirroring实现CDC功能

    对于较早版本还没有镜像Mirror的配置,则可以使用Shadow服务器的Dejournaling filter routine。

    可以参考:CDC系列之二 :使用Dejournaling filter routine在Caché上通过Shadow实现CDC

    IRIS 没有默认的删除备份文件的任务。

    你可以通过命令$zf(-100)或者%File下面的Delete方法实现通过ObjectScript删除磁盘文件的操作,再将代码添加入定时任务中实现定时删除。

    同时注意,不建议在生产环境将IRIS自带的在线备份工具作为灾备恢复使用,因为该工具仅仅备份 IRIS.Dat 中的内容,而这些内容对于灾难恢复是不够的。

    推荐使用外部备份的方式进行备份,详细内容参见(https://docs.intersystems.com/irisforhealthlatest/csp/docbook/DocBook.UI...

    可以通过Ens.Config.Production 的 %OpenId 方法打开现有的Production,

    新建一个Ens.Config.Item的对象,该对象对应于Production界面中的各个组件(BusinessHost)

    再使用production.Items.Insert方法将该Item对象插入到现有Production中,就可实现使用代码的方式创建Production 的 BusinessHost。

    同时可以通过创建Ens.Config.Setting的实例以及设置相关属性的方式,对创建的BusinessHost中的配置在代码中进行设定,比如设定加载BO的URL、凭据等。

      #Dim businessHost as Ens.Config.Item = ##class(Ens.Config.Item).%New()
      #Dim setting as Ens.Config.Setting = ##class(Ens.Config.Setting).%New()
      #Dim production as Ens.Config.Production = ##class(Ens.Config.Production).%OpenId("MyPkg.DemoProduction")
      Set setting.Name="WebServiceURL"
      Set setting.Value="http://localhost:52773/MyWS/Demo.Test.cls"
      Set businessHost.ClassName="MyPkg.Operation.HISWSOperation"
      Set businessHost.Name ="HIS web 服务"
      Set businessHost.Production = production
      Do businessHost.Settings.Insert(setting)
      Do production.Items.Insert(businessHost)
      Set tsc = production.%Save()
    USER>set file="box.xml"
    USER>set sc=$system.OBJ.Export("box.GBL",.file) 
    
    Exportieren in XML gestartet am 06/08/2021 11:46:58
    Exportiere Global: ^box
    Export erfolgreich abgeschlossen. 
    
    USER>$type box.XML 
    
    <?xml version="1.0" encoding="UTF-8"?>
    <Export generator="Cache" version="25" zv="IRIS for Windows (x86-64) 2021.1 (Build 209U)" ts="2021-06-08 11:46:58">
    <Global>
    <Node><Sub>^box</Sub>
    <Node><Sub>1</Sub>
    <Node><Sub>1</Sub>
    <Data> </Data>
    <Node><Sub>0</Sub>
    <DataBase64>G1syOzRI
    </DataBase64>
    </Node>
    <Node><Sub>1</Sub>
    <Data>1</Data>
    </Node>
    <Node><Sub>2</Sub>
    <Data>...456..9</Data>
    </Node>
    </Node>
    <Node><Sub>2</Sub>
    <Data> </Data>
    <Node><Sub>0</Sub>
    <DataBase64>G1syOzEwSA==
    </DataBase64>
    - - - -   removed ------- 
    </Node>
    </Node>
    <Data> </Data>
    USER>

    一般由 Ensemble 生成的Soap 服务的 URL 地址有下面几个部分组成:

    http(s)://DomainName:port/web application name/bs类名.cls组成

    前面域名端口由提供服务的服务器地址以及web server决定.

    web application name可以在SMP的菜单:系统管理 -- 安全 -- 应用程序 --  web 应用程序中设置

    bs类名为创建包含web method 的类的类名。在将类添加到Ensemble 的 BS中时,默认服务名为类名。如果你手动设置了服务名称,则需要在soap url中使用 CfgItem 参数来指明. 例如:http://Myserver/MyApplication/MyClass.cls?CfgItem=MyServiceName

    为了方便的将FHIR转化为SDA3的格式,可以直接添加HS.FHIR.DTL.Util.HC.FHIR.SDA3.Process 到 Production配置界面中的流程部分,而不需直接调用DT。

    更详细内容请参考:https://docs.intersystems.com/irisforhealthlatest/csp/docbook/Doc.View.c...