3

我从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

4

2 回答 2

3

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

于 2019-12-05T07:08:34.993 回答
2

我现在使用这个 StatelessConnection:

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 中的默认值会有意义吗?

于 2019-12-05T09:21:30.260 回答