文章
· 六月 23, 2021 阅读大约需 3 分钟

FAQ 常见问题系列--互操作篇 如何在Production中通过JDBC访问外部数据库

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. 常用基本故障排查

基本配置步骤

前提,在配置之前请您首先确认您的环境中已经正确安装了Java。
1. 创建JDBC SQL Gateway,
1)打开管理门户SMP(System Management Portal),System  > Configuration  > SQL Gateway Connections, 创建JDBC类型连接,连接名称为"MysqlJDBC",如下图所示,
 
2)测试该JDBC连接,点击【TEST Connection】如果成功可以进行下一步。
2. 创建Java Gateway Service, 
打开Production Configuration页面,创建Business Service, 该Service名为JService,如下图所示,
 
需要注意的是,如果系统没有配置JavaHome,那么需要手动在组件的”其他设置“中设置"JavaHome"路径。
3. 配置BS/BO的DSN和JGService。
打开Production Configuration页面, 选中使用SQL Inbound Adatper的Business Service或者使用SQL Outbound Adapter的Business Operaiont组件,组件如何创建在这里不做探讨,详细说明可参见以下在线文档,
https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=ESQL_inbound
https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=ESQL_outbound

1)设置DSN,位于"基本设置"下,值为MysqlJDBC
2) 设置JGService,位于”其他设置“下,值为JService

4. 您现在可以在BS/BO中通过JDBC访问外部数据库了。

JDBC Gateway和Java Gateway Service的区别


在上面第1.步中,当您进行JDBC连接测试的时候,您可以打开SMP,System > Configuration > JDBC Gateway Server, 您可以看到”JDBC Gateway is running“, 如下图所示,
 
这里看到的JDBC Gateway与我们在Production中创建的Java Gateway Service是完全独立的,前者基于系统层面,后者仅作为Production中的Business Service,仅存在于互操作模块。但二者所承担的角色可以理解为是相同的,二者都会创建JVM运行时环境,来处理JDBC连接程序。

常见的问题类型有


1. JDBC连接配置有误,连接串设置或者驱动问题。
2. Java Gateway Service/JDBC Gateway端口号占用
3. JAVA没有正确安装。
4. 数据类型不匹配。
造成这种情况的原因有多种,举一个最近遇到的客户例子,在BO中通过JDBC插入SQLServer数据库,在Production中该字段类型为%String, 但是对应SQLServer中字段为int型,那么就会遇到如下的错误,
Error#5023 远程网关错误,JDBC Gateway execUpdate(0) error -1: Remote JDBC error,在将varchar值 '.'转换为int型时失败。
5. 字符集问题。
该类型问题一般情况下都需要具体问题具体分析,因为涉及到IRIS和外部数据库的编码,以及网络传输过程中的编码。
举一个最近遇到的客户例子,BO中通过JDBC查询Mysql数据库,中文乱码,最后是通过更改JDBC连接串解决的,在连接串的最后添加了如下参数,
?useUnicode=true&characterEncoding=UTF8

常用故障排查工具


1. Java Gateway Service 日志。
打开Producton,选择该Java Gateway Service,设置“其他设置”下日志文件,其中该日志文件包含路径和文件名,如果该文件名不存在,会自动创建。
2. JDBC Gateway 日志
打开SMP,System > Configuration > JDBC Gateway Server, 配置“日志文件”
3. Driver Log
通过在JDBC连接串最后加上 /jdbc.log,如, jdbc:IRIS://127.0.0.1:51773/User/jdbc.log