我从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握手(在双方交换和验证证书)非常昂贵。
所以最好的方法肯定是:
- 打开连接
- 通过此连接执行当前需要执行的所有RFC调用
- 然后关闭连接