我从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:=;;;]到目前为止,我创建了许多连接实例,并且从未显式关闭它们。
如果Python进程再次启动(通过),那么RFC调用可以正常工作。
我该怎么办:
发布于 2019-12-05 07:08:34
存在关于此错误的SAP注释。它说服务器端有限制,你需要限制你的客户。附注316877包含服务器端参数以增加大小。
关闭联系是有意义的。因为RFC工作在TCP/IP级别,所以在响应后没有自动关闭例程,看起来像rest/http。
发布于 2019-12-05 09:21:30
我现在使用这个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中的缺省值是有意义的?
发布于 2022-11-23 11:08:51
前面的答案仅仅是“部分”正确的,因为我们必须考虑到,这里提到的旧的same 316877是关于SAP的,这是一个与ABAP系统运行在同一个主机上的组件。因此,在这种情况下,“客户端”和“服务器”是同一台主机,这使事情变得混乱.
事实是:双方都有限制,外部RFC程序以及ABAP后端。您可以通过检查错误消息的“位置”字段来查看您正在命中的限制。在您的情况下,您正在达到客户端限制:
LOCATION CPIC (TCP/IP) on local host ... with Unicode- 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.最后,还可以通过配置参数设置限制:
- NW RFC Library: in sapnwrfc.ini file set MAX\_CPIC\_CONVERSATIONS=300(因为PyRFC是基于PyRFC库的,所以这也适用于PyRFC)。
- SAP JCo: (doesn't have a central config file)- SAP NCo: in app.config file set关于是否应该关闭连接以及何时关闭连接的问题,您不仅需要考虑对客户端程序的影响,还需要考虑对ABAP后端系统的影响!每个打开的RFC连接都在后端系统中分配一个用户会话,这将消耗相当多的资源,对于其他希望登录和使用系统的用户(通过RFC或通过SAPGui)来说,这些资源不再可用。
而且,你需要考虑的是,当连接不再被使用时,你不仅在你自己的程序中消耗一个座位,你还在消耗后端系统中500个座位中的一个。这意味着,如果有三个具有这种连接泄漏的“错误行为”程序,后端中的500个会话很快就会被阻止,那么后端就不能接受来自其他程序或SAP系统的进一步连接。
因此,首先要注意的是,当您不再需要连接时,您应该立即关闭它,以减少后端的压力。
接下来,您需要考虑打开一个连接,导致后端内核执行“登录过程”,这很费时。我不相信上面的测试有1000个循环调用。这里一定有什么不对劲。如果您为每个调用打开和关闭一个新连接,那么的性能肯定会慢一些。是这样的,尤其是当使用SNC而不是用户/密码登录时,因为SNC握手(双方交换和验证证书)非常昂贵。
所以最好的方法就是:
https://stackoverflow.com/questions/59178676
复制相似问题