直接上代码:
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

