大数跨境
0
0

震惊!ABAP 在同一进程开多条数据库连接原来这么简单!

震惊!ABAP 在同一进程开多条数据库连接原来这么简单! 思创湾
2025-07-14
2
图片
图片

直接上代码:


DATA: lv_conam TYPE dbcon_name VALUE 'R/3*ZTEST'
INSERT ztest CONNECTION (lv_conam) FROM ls_test. 
COMMIT CONNECTION (lv_conam).

←左右→滑动查看代码


这段短短三行的 ABAP 代码展示了如何通过名叫 R/3*ZTEST 的 service connection,在同一个 ABAP 工作进程里打开第二条到标准数据库的连接,将数据写入目标表,并用局部事务提交。


这个简短的例子体现了 Open SQL CONNECTION 附加选项的威力:ABAP 开发者既能在同一逻辑会话里对主连接保持不变,又可以对另一连接实施精细化的事务控制。这种模式常见于主数据复制、日志分表、归档表插入,甚至在 HANA sidecar 场景里按租户分区写入不同 schema。[1]







丨ABAP 开启多条数据库连接的业务价值何在?


将数据写入 SAP 标准数据库通常依赖默认连接;一旦加上 CONNECTION (lv_conam),Open SQL 指令会改为使用名为 lv_conam 的服务连接或二级连接。这样就能在同一 ABAP 程序里维护多条数据库 LUW,而不会彼此干扰。[2]


这种用法的典型业务场景包括但不限于:

  • 把实时交易数据插入快速写入表,同时把聚合摘要写入分析表。

  • 在生产系统里向预归档表批量灌库,但不影响在线事务表。

  • 通过一条连接写入 HANA calculation view 所映射的列存表,在另一条连接中保留行存 OLTP 数据。


可能有朋友对上面这三行代码的语法不是很了解,笔者这里简单叙述一下。


DATA: lv_conam TYPE dbcon_name VALUE 'R/3*ZTEST'.

←左右→滑动查看代码


dbcon_name 是 SAP DDIC 里专门存放逻辑连接名的元素,其值遵循 R/3*name 规则:固定前缀 R/3* 加上 1–26 位大小写敏感的字母或数字。


在 service connection 模式下,这种名称不需要维护表 DBCON,它自动继承标准连接的主机、实例、用户等属性,因此创建成本极低,适合同库多事务隔离。


INSERT ztest CONNECTION (lv_conam) FROM ls_test.

←左右→滑动查看代码


INSERT dbtab 属于 Open SQL DML 指令。加上 CONNECTION (lv_conam) 后,ABAP 运行时会切换到指向 R/3*ZTEST 的连接执行插入,但当前内存会话依旧停留在默认连接。[3]


这种写法与 CONNECT TO 的 native SQL 方案不同:后者建立独立会话,需要显式关闭;而 Open SQL 服务连接由工作进程统一管理,性能更优,线程安全,而且最多可同时开 16 条连接。[4]


COMMITCONNECTION (lv_conam).

←左右→滑动查看代码


COMMIT CONNECTION 仅作用于 lv_conam 所代表的数据库 LUW,并不会触发标准连接上的隐式 COMMIT WORK 或更新任务提交。


因此开发者可在同一 ABAP 报表里先行提交服务连接上的大批量写入,然后再处理主连接事务,降低锁竞争并缩短持锁时间。







丨服务连接、二级连接与标准连接的差异


  • 标准连接
    ——每个工作进程启动时即打开,无法关闭。(SAP Help Portal)
  • 二级连接
    ——需在事务码 DBCO 里配置表 DBCON,可指向异构数据库;Open SQL、AMDP、Native SQL 均可使用。[5]
  • 服务连接
    ——仅限于本地标准数据库 schema,通过 R/3* 前缀创建,不占用表 DBCON 条目;用途在于局部事务或并行游标。


事务隔离与锁管理


在服务连接上执行 DML 语句时,数据库会对目标行加锁直至 COMMIT CONNECTION 或 ROLLBACK CONNECTION。如果忽略显式提交,锁将随着隐式工作进程切换而释放,存在死锁隐患。







丨真实项目实战案例


在财务系统中,自开发数据库表 ZACC_DOC 存储最近两年的凭证;超过两年的历史数据落地到 ZACC_DOC_ARC。开发者希望在夜间批处理时,一边仍让线上用户写入 ZACC_DOC,一边把老记录搬到 ZACC_DOC_ARC 并立即提交。通过如下模式即可实现在线业务与归档写入互不干扰:

1. 在线插入继续使用标准连接。

2. 批处理 INSERT ... CONNECTION (lv_conam) 把归档数据写入 ZACC_DOC_ARC

3. COMMIT CONNECTION (lv_conam) 立即释放归档表锁,避免与实时交易竞争。






丨完整可运行示例程序

REPORT z_multi_conn_insert.

TYPES: BEGINOF ty_demo,
         carrid  TYPE sflight-carrid,
         connid  TYPE sflight-connid,
         fldate  TYPE sflight-fldate,
ENDOF ty_demo.

DATA: ls_test   TYPE ty_demo,
      lv_conam  TYPE dbcon_name VALUE'R/3*ZTEST'.

ls_test-carrid = 'LH'.
ls_test-connid = '0400'.
ls_test-fldate = sy-datum.

" 在服务连接上插入数据
INSERT ztest CONNECTION (lv_conam) FROM ls_test.

"
立即提交服务连接,释放锁
COMMIT CONNECTION (lv_conam).

"在标准连接插入另一条演示记录
INSERT ztest FROM ls_test.

COMMIT WORK.  "
提交标准连接

要运行示例,首先在 SE11 创建表 ZTEST,结构同 ty_demo;无需在 DBCO 维护连接,因为 R/3*ZTEST 属于服务连接。

程序执行完后,ZTEST 将出现两行记录:一行来自服务连接,一行来自标准连接,可用 SE16 分别验证其提交时序。






丨常见错误排查与调试技巧

  • 连接名拼写
    ——任何大小写差错都会触发 CX_SY_OPEN_SQL_DB。可在 ST05 SQL Trace 里观察 CONNECT 调用。
  • 未提交事务
    ——长时间占锁会冻结业务;可用 DBACOCKPIT > Sessions 查看锁定条目。
  • 超过连接数限制
    ——单工作进程最多 16 条;建议在批量作业里显式 ROLLBACK CONNECTION 或让工作进程空闲回收。
  • 二级连接密码失效
    ——若改用真正的二级连接,需定期更新 DBCON 凭据,否则在升级后触发登录失败。







丨性能与安全注意事项


开启多连接并发写入能显著提升吞吐,但也带来以下挑战:


  • 资源竞争
    ——每新增一条连接都要耗用一个 DB session;在高并发系统里应评估数据库 max sessions。
  • 审计合规
    ——服务连接继承标准登录用户,审计日志无法区分;若需要隔离审计,应改用二级连接并配置专用 DB 用户。
  • 事务边界清晰
    ——务必确保对应 COMMIT CONNECTION 与 ROLLBACK CONNECTION 成对出现,否则可能造成部分提交。







丨一句话总结


通过 INSERT ... CONNECTION 与 COMMIT CONNECTION 的组合,ABAP 开发者可以在不引入复杂 native SQL 的前提下,对同一数据库创建轻量级局部事务,既提升并发性能,又保持代码的整洁与安全。无论是归档、分库、还是并发游标场景,合理运用服务连接都能让传统 ABAP 程序焕发新的灵活性和伸缩性。



参考文献

[1]: https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abenopensql_multiconnect.htm

[2]: https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/abenopensql_multiconnect.htm

[3]: https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/abapinsert_dbtab.htm

[4]: https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abendb_commit.htm

[5]: https://help.sap.com/docs/SAP_Solution_Manager/75e9596d33054b4da40e5b832972bdd1/91be1bfac5044e1aa7dd49f124e0adac.html




思创湾·SAP(中国)科创赋能中心,是 SAP 与上海市静安区人民政府、市北高新集团联合打造,由市北高新聚能湾创新创业中心运营,面对科技企业的创新赋能平台。平台集创新、孵化、赋能、交流、服务于一体,通过科技创新与产业赋能双轮驱动,为创业者和科创企业赋能转型注入数字新活力。


图片


图片

【声明】内容源于网络
0
0
思创湾
思创湾,是SAP与上海市静安区人民政府、市北高新集团联合打造,由市北高新聚能湾创新创业中心运营,面对科技企业的创新赋能平台。平台集创新、孵化、赋能、交流、服务于一体,通过科技创新与产业赋能双轮驱动,为创业者和科创企业赋能转型注入数字新活力。
内容 126
粉丝 0
思创湾 思创湾,是SAP与上海市静安区人民政府、市北高新集团联合打造,由市北高新聚能湾创新创业中心运营,面对科技企业的创新赋能平台。平台集创新、孵化、赋能、交流、服务于一体,通过科技创新与产业赋能双轮驱动,为创业者和科创企业赋能转型注入数字新活力。
总阅读18
粉丝0
内容126