PyRFC中超过错误的200个会话的最大数目



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

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:=;;;]

到目前为止,我创建了很多Connection实例,但从未明确关闭它们。

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

我应该怎么做:

  • 是否显式关闭连接
  • 重用连接
  • 还有别的吗

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

存在关于此错误的SAP注释。它说服务器端有限制,你需要限制你的客户端。注意316877包含了用于增加大小的服务器端参数
密切联系是有意义的。因为RFC在TCP/IP级别上工作,所以它没有像rest/http那样在响应后自动关闭例程。

我现在使用这个无状态连接:

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()

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

我比较了性能。如果你每次通话后都关闭连接,你会松多少?

for i in range(1000):
#conn.close()
print(i, conn.call('RFC_PING'))

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

也许让StatelessConnection成为PyRFC中的默认连接是有意义的?

前面的答案只是"部分";正确,因为我们必须考虑到这里提到的旧SAP注释316877是关于SAP ITS的,它是一个过去与ABAP系统在同一主机上运行的组件。因此;客户端";以及";服务器";在这种情况下是同一个宿主,这混淆了问题。。。

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

LOCATION    CPIC (TCP/IP) on local host ... with Unicode
  • CPIC库链接到每个外部RFC程序,默认连接限制为200。您可以通过在运行外部程序的环境中设置以下环境变量来更改此值:

    导出CPIC_MAX_CONV=300

    此外,大多数RFC SDK导出API,这允许以编程方式设置该值,例如

    • NW RFC库:RfcSetMaximumCpicConversations(300,&errorInfo)
    • SAP JCo:JCo.setProperty("JCo.cpic_maxconv","300")
    • SAP NCo:GeneralConfiguration.CPICMaxConnections=300;我不知道PyRFC是否也公开了这样一个API

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

    • NW RFC库:在sapnwrfc.ini文件中,设置MAX_CPIC_CONVERSATION=300

      (由于PyRFC基于NW RFC库,因此这也适用于PyRFC。)

    • SAP JCo:(没有中央配置文件)

    • SAP NCo:在app.config文件集中设置

<SAP.Middleware.Connector>
<GeneralSettings cpicMaxConnections=300 />
</SAP.Middleware.Connector>
  • ABAP后端系统的默认限制为500。可以通过设置以下配置文件参数进行更改:rdisp/max_com_entries

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

此外,您需要考虑的是,当打开一个不再使用的连接时,您不仅占用了自己程序中的一个席位,还占用了后端系统中500个席位中的一个中的一个。这意味着,如果存在三个";行为不端";程序发生这种连接泄漏时,后端的500个对话会被迅速阻止,然后后端无法接受来自其他程序或SAP系统的进一步连接。

因此,需要注意的第一点是,一旦不再需要,就应该立即关闭连接,以减少后端的压力。

接下来,您需要考虑打开连接会导致后端内核执行";登录过程";,这相当耗时。我不相信上面的1000个循环调用的测试。这里一定出了问题如果每次呼叫都打开和关闭一个新连接,性能肯定会变慢这是真的,尤其是当使用SNC而不是用户/密码登录时,因为SNC握手(在双方交换和验证证书)非常昂贵。

所以最好的方法肯定是:

  1. 打开连接
  2. 通过此连接执行当前需要执行的所有RFC调用
  3. 然后关闭连接

相关内容

  • 没有找到相关文章

最新更新