RPC 请求中提供了过多的参数。最多应为 2100

本文解析了SQL Server中用户定义函数参数数量的最大限制为2100,并对比了Oracle与MySQL的参数限制,Oracle和MySQL的最大参数限制均为65536。

工作中碰到如下报错:

com.microsoft.sqlserver.jdbc.SQLServerException: 传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确。此 RPC 请求中提供了过多的参数。最多应为 2100。

 

 

原因:

经查证, 微软官方文档, 最大容量规范:

https://docs.microsoft.com/zh-cn/sql/sql-server/maximum-capacity-specifications-for-sql-server?view=sql-server-2017

 

列表中的 每个用户定义函数的参数个数: 2100

 

 

扩展:

oracle

最大限制为:65536; (number of formal parameters in an explicit cursor, function, or procedure)

https://docs.oracle.com/cd/E11882_01/appdev.112/e25519/limits.htm#LNPLS018

 

mysql

最大限制为: 65536(max_allowed_packet)

The number of values in the IN list is only limited by the max_allowed_packet value.

https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#function_in

 

https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_max_allowed_packet

 

转载于:https://www.cnblogs.com/OrchidCat/articles/9365343.html

RPC机制中强调最多一次调用语义主要有以下几方面原因: ### 数据一致性 幂等性定义为一次和多次请求某一个资源对于资源本身应该具有同样的结果(网络超时等问题除外),也就是说任意多次执行对资源本身所产生的影响均与一次执行的影响相同[^2]。在许多业务场景下,确保操作的幂等性对于数据的一致性至关重要。例如在金融系统中,转账操作如果被重复执行,会导致资金的错误转移,影响账户余额的准确性。强调最多一次调用可以避免因重复调用而对资源产生额外的、非预期的影响,从而保证数据的一致性和准确性。 ### 系统稳定性 在分布式架构下,不同服务之间频繁调用,对于某个具体的服务而言,可能会面临高并发场景,服务节点可能由于访问量过大而引起一系列问题,如业务处理耗时过长、CPU飘高、频繁Full GC以及服务进程直接宕机等[^1]。如果允许一个请求被多次执行,会进一步加重服务节点的负担,增加系统出现故障的风险。强调最多一次调用可以减少不必要的重复处理,降低系统的负载,提高系统的稳定性和可用性。 ### 避免资源浪费 重复的请求会消耗系统的资源,包括计算资源、存储资源和网络带宽等。例如,一个复杂的数据库查询操作如果被多次执行,会占用数据库服务器的CPU和内存资源,同时也会增加网络传输的负担。强调最多一次调用可以避免这些资源的浪费,提高资源的利用效率。 ### 简化系统设计 当系统能够保证请求最多执行一次时,开发者在设计和实现服务时可以简化逻辑,不需要考虑重复请求可能带来的各种复杂情况。例如,在处理业务逻辑时不需要额外编写代码来处理重复请求的情况,减少了代码的复杂度和维护成本。 ```python # 以下是一个简单的示例代码,模拟一个幂等的RPC调用 class RPCService: def __init__(self): self.executed = set() def call(self, request_id, operation): if request_id in self.executed: print(f"Request {request_id} has already been executed. Skipping.") return self.executed.add(request_id) print(f"Executing operation: {operation} for request {request_id}") # 这里可以添加具体的业务逻辑 return "Operation completed successfully" # 使用示例 service = RPCService() request1_id = "123" request2_id = "456" service.call(request1_id, "transfer_funds") service.call(request1_id, "transfer_funds") # 重复调用,会被跳过 service.call(request2_id, "create_user") ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值