首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >200个会话的最大值超过了PyRFC中的错误

200个会话的最大值超过了PyRFC中的错误
EN

Stack Overflow用户
提问于 2019-12-04 14:46:50
回答 3查看 722关注 0票数 4

我从PyRFC库中得到了这个错误:

代码语言:javascript
复制
Traceback (most recent call last):
...
  File "/.../sap_connection.py", line 486, in get_connection
    return Connection(**get_connection_dict(contact_host))
  File "src/pyrfc/_pyrfc.pyx", line 182, in pyrfc._pyrfc.Connection.__init__
  File "src/pyrfc/_pyrfc.pyx", line 226, in pyrfc._pyrfc.Connection._open
  File "src/pyrfc/_pyrfc.pyx", line 256, in pyrfc._pyrfc.Connection._error
pyrfc._exception.CommunicationError: RFC_COMMUNICATION_FAILURE (rc=1): key=RFC_COMMUNICATION_FAILURE, message=
LOCATION    CPIC (TCP/IP) on local host with Unicode
ERROR       max no of 200 conversations exceeded
TIME        Wed Dec  4 13:53:22 2019
RELEASE     753
COMPONENT   CPIC (TCP/IP) with Unicode
VERSION     3
RC          466
MODULE      /bas/753_REL/src/krn/si/cpic/r3cpic.c
LINE        15830
COUNTER     201
 [MSG: class=, type=, number=, v1-4:=;;;]

到目前为止,我创建了许多连接实例,并且从未显式关闭它们。

如果Python进程再次启动(通过),那么RFC调用可以正常工作。

我该怎么办:

  • 显式关闭连接?
  • 重新使用连接?
  • 还有别的吗?

相关问题:https://github.com/SAP/PyRFC/issues/150

EN

回答 3

Stack Overflow用户

发布于 2019-12-05 07:08:34

存在关于此错误的SAP注释。它说服务器端有限制,你需要限制你的客户。附注316877包含服务器端参数以增加大小。

关闭联系是有意义的。因为RFC工作在TCP/IP级别,所以在响应后没有自动关闭例程,看起来像rest/http。

票数 3
EN

Stack Overflow用户

发布于 2019-12-05 09:21:30

我现在使用这个StatelessConnection:

代码语言:javascript
复制
from pyrfc import Connection
class StatelessConnection(Connection):
    def call(self, rfc_name, **kwargs):
        try:
            return super(StatelessConnection, self).call(rfc_name, **kwargs)
        finally:
            self.close()

性能可能会稍低一些,但它会使整体处理更加容易。

..。我比较了表演。如果你在每次通话后关闭连接,你会损失多少?

代码语言:javascript
复制
for i in range(1000):
    #conn.close()
    print(i, conn.call('RFC_PING'))

在我的系统中,持续时间是相等的-- "close()“和”close()“没有: 28秒。

也许让StatelessConnection成为PyRFC中的缺省值是有意义的?

票数 2
EN

Stack Overflow用户

发布于 2022-11-23 11:08:51

前面的答案仅仅是“部分”正确的,因为我们必须考虑到,这里提到的旧的same 316877是关于SAP的,这是一个与ABAP系统运行在同一个主机上的组件。因此,在这种情况下,“客户端”和“服务器”是同一台主机,这使事情变得混乱.

事实是:双方都有限制,外部RFC程序以及ABAP后端。您可以通过检查错误消息的“位置”字段来查看您正在命中的限制。在您的情况下,您正在达到客户端限制:

代码语言:javascript
复制
LOCATION    CPIC (TCP/IP) on local host ... with Unicode
  • 连接到每个外部RFC程序的CPIC库的默认连接限制为200。可以通过在运行外部程序的环境中设置以下环境变量来更改此值: 导出CPIC_MAX_CONV=300 此外,大多数RFC SDK导出API,允许以编程方式设置此值。
代码语言:javascript
复制
- NW RFC Library: RfcSetMaximumCpicConversations(300, &errorInfo);
- SAP JCo: JCo.setProperty("jco.cpic\_maxconv", "300");
- SAP NCo: GeneralConfiguration.CPICMaxConnections = 300; I don't know, whether PyRFC also exposes such an API.

最后,还可以通过配置参数设置限制:

代码语言:javascript
复制
- NW RFC Library: in sapnwrfc.ini file set MAX\_CPIC\_CONVERSATIONS=300

(因为PyRFC是基于PyRFC库的,所以这也适用于PyRFC)。

代码语言:javascript
复制
- SAP JCo: (doesn't have a central config file)
代码语言:javascript
复制
- SAP NCo: in app.config file set

  • ABAP后端系统的默认限制为500。可以通过设置以下配置文件参数来更改它: rdisp/max_comm_entries

关于是否应该关闭连接以及何时关闭连接的问题,您不仅需要考虑对客户端程序的影响,还需要考虑对ABAP后端系统的影响!每个打开的RFC连接都在后端系统中分配一个用户会话,这将消耗相当多的资源,对于其他希望登录和使用系统的用户(通过RFC或通过SAPGui)来说,这些资源不再可用。

而且,你需要考虑的是,当连接不再被使用时,你不仅在你自己的程序中消耗一个座位,你还在消耗后端系统中500个座位中的一个。这意味着,如果有三个具有这种连接泄漏的“错误行为”程序,后端中的500个会话很快就会被阻止,那么后端就不能接受来自其他程序或SAP系统的进一步连接。

因此,首先要注意的是,当您不再需要连接时,您应该立即关闭它,以减少后端的压力。

接下来,您需要考虑打开一个连接,导致后端内核执行“登录过程”,这很费时。我不相信上面的测试有1000个循环调用。这里一定有什么不对劲。如果您为每个调用打开和关闭一个新连接,那么的性能肯定会慢一些。是这样的,尤其是当使用SNC而不是用户/密码登录时,因为SNC握手(双方交换和验证证书)非常昂贵。

所以最好的方法就是:

  1. 打开连接
  2. 是否通过此连接执行当前需要执行的所有RFC调用?
  3. 之后关闭连接
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59178676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档