请求解决ADF无法重用或断开Progress DB ODBC连接的问题
Progress ODBC + Azure Data Factory 会话堆积问题解决方案
问题背景
使用授权的Progress ODBC连接器(版本11.7,PROGRESS_OE_11.7_WIN_64_SQLCLIENTACCESS)与Progress DB建立ODBC连接,Azure Data Factory(ADF)通过该连接执行数据复制、存储过程调用等任务时功能正常,但在Until循环场景下存在会话堆积问题:每次循环执行SQL命令后,ADF会创建新会话,既不重用原有连接也不主动关闭旧会话;旧会话需约100秒后超时回收,速度不足以避免会话达到上限。此前尝试配置ODBC扩展属性(SQL_ATTR_CONNECTION_POOLING=0、CPTimeout=0、Pooling=0、SQL_INFX_ATTR_CONNECTION_POOLING=0、CONNECTION_POOLING=0)未生效。
解决方案
1. 启用ADF活动的连接复用
- 在ADF的SQL类活动(如Stored Procedure、Lookup活动)的高级设置中,开启
Connection reuse选项,确保同一Linked Service的连接被复用,而非每次操作新建连接。 - 确保Until循环内所有SQL操作绑定同一个Linked Service实例,禁止在循环内动态创建新的Linked Service。
2. 修正Progress ODBC连接池配置
之前的参数配置方向错误(禁用了连接池),需调整为启用连接池并设置合理回收超时:
- ODBC数据源管理器配置:打开64位ODBC数据源管理器,找到目标Progress数据源,进入配置页面的连接池设置,勾选启用连接池,设置
Connection Timeout为30秒(或更短,根据业务调整)。 - ADF连接字符串配置:在Linked Service的ODBC连接字符串中添加正确的池化参数:
注意:Progress ODBC 11.7的池化参数使用Pooling=Yes;CPTimeout=30Pooling=Yes/No而非数值,CPTimeout定义闲置连接的回收超时秒数。
3. 优化ADF Until循环设计
- 将循环内的多次SQL操作合并为单次批量执行,例如封装为一个存储过程,减少连接创建频次。
- 避免在循环内重复初始化SQL活动,通过参数传递动态调整执行内容,复用同一活动实例的连接。
4. 调整Progress DB的会话回收策略
- 缩短闲置会话超时时间:使用Progress管理命令设置会话超时为30秒(需DBA权限):
proshut <数据库名称> -C "-timeout 30" - 临时调整最大会话数参数
-M,但仅作为应急方案,核心仍需解决连接复用问题。
5. 检查Self-Hosted Integration Runtime(SHIR)状态
- 若使用SHIR,确认已安装64位Progress ODBC驱动,且SHIR进程无内存泄漏。
- 重启SHIR服务,清除残留的未释放连接。
内容的提问来源于stack exchange,提问作者Tautvydas Perminas
相关产品推荐
相关产品推荐

