我们有一些Java应用程序通过JDBC使用通用的Azure Sql数据库。每个应用程序都有一个与该数据库的连接池。池中的连接数是有限的,因此来自所有应用程序的连接总数远低于数据库的resource limits。
最近我们经常得到这些类型的例外:
com.microsoft.sqlserver.jdbc.SQLServerException:资源ID:1 数据库的请求限制是200并且已达到。看到 'http://go.microsoft.com/fwlink/?LinkId=267637'寻求帮助
有关这些错误可能原因的猜测吗?
修改
我们的一个理论与Sql Server的MaxDOP参数有关。
显然,如果此参数大于1,则Sql Server可能会为每个查询使用多个工作线程。我们认为sp_who
中没有Login
值的那些行对应于其中一个连接使用的其他工作线程。这样,工作线程可能比连接多得多,所以即使连接数量有限,我们也会使所有工作线程都饱和。
EDIT2:
显然Azure Sql的默认Max Parallelism设置为0(无限制),并且只能通过support ticket进行更改。
EDIT3:
还有一个证据。我们在master数据库上执行了SELECT * FROM sys.resource_stat
。我们看到max_worker_percent
不时达到100%。我们真的在使工作线程饱和。
答案 0 :(得分:4)
默认行为将在2020年8月更改:
Changing default MAXDOP in Azure SQL Database
为了提高客户工作负载性能并减少不必要的资源利用,Azure SQL数据库中新数据库的默认MAXDOP设置已从先前的默认值0(无限制)更改为8。< / strong>
如何更改现有数据库的MAXDOP?
可以使用数据库范围内的ALTER DATABASE SCOPED CONFIGURATION语句更改MAXDOP。
ALTER DATABASE SCOPED CONFIGURATION SET MAXDOP = 4;
Azure SQL数据库中查询并行过多的症状是什么?
在Azure SQL数据库中,过度并行的一种常见症状是超出了工作线程数的资源管理限制。发生这种情况时,会引发错误10928,
“Resource ID : 1. The request limit for the database is N and has been reached”
,其中N代表数据库或弹性池的工作线程限制(但是,请注意,还有其他可能导致此错误的原因)。
答案 1 :(得分:3)
Sql DB支持更改Max DOP设置。您可以通过ALTER DATABASE SCOPED CONFIGURATION T-SQL更改它 https://msdn.microsoft.com/en-us/library/mt629158.aspx
答案 2 :(得分:2)
似乎我们在问题编辑中提到的MaxDop参数方面走在了正确的轨道上。
Sql server有时会使用多个工作线程来执行查询,因此连接数并不总是与执行线程数相对应。在我们的例子中,我们定期执行的查询有时会产生数十个工作线程,使工作线程池饱和(因为它的几个副本会同时运行)
自Azure SQL doesn't support setting this parameter globally以来,我们的解决方案是将OPTION (MAXDOP 1)
添加到有问题的查询中,以便其执行更具可预测性(以并行性和速度为代价)。
我们还没有看到&#34;资源限制&#34;从那以后的例外。