gpt4 book ai didi

java - 多线程java客户端会导致SQL Server 2008的CPU利用率高吗?

转载 作者:行者123 更新时间:2023-12-01 11:43:53 25 4
gpt4 key购买 nike

我是一名 Java 开发人员,而不是 DBA,并且想咨询有关SQL Server 2008 中 CPU 使用率过高(不在 Java 应用服务器中)遇到的问题

Java 客户端使用多线程,以简化:

  1. 40 个线程,每个线程从表 X 中选择/插入/更新(简单的 SQL 语句) - 自动提交处于开启状态
  2. 10 个线程,每个线程从表 Y 中选择/插入/更新(简单的 SQL 语句),并从表 X 中选择(同样简单)(以检查是否存在) - 自动提交处于开启状态

两组线程池同时运行。每个线程都被分配给“来自队列的消息”(文件),加载/读取其分配的“消息”,并插入/更新其相应的表。这2个线程池通过datasouce从单个连接池获取连接,例如:

    <Resource auth="Container" driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" maxActive="100" maxIdle="10" maxWait="10000" name="jdbc/abc_DataSource" password="p" type="javax.sql.DataSource" url="jdbc:sqlserver://NTxxx\\instyyy:12345;databaseName=dbzzz" username="u"/>

数据库环境是 SQL Server 2008 R2,并由其他应用程序共享,但上面的 Java 客户端被标记为导致 CPU 使用率的原因。当 Java 客户端关闭后,利用率稳定下来。从Java客户端的应用服务器Jboss来看,Java运行的地方没有任何性能问题,CPU和内存都很好;只有数据库服务器的 CPU 出现峰值。

我的问题是,大量线程会消耗数据源的 maxActive 100 池,是否可能是原因?如果是这样,我如何证明这一点 从数据库的角度来看,即。 SQL 服务器统计信息指向 Java 客户端的高容量线程?

也发布在 DBA 堆栈中,但没有得到任何 View ...: https://dba.stackexchange.com/questions/96502

最佳答案

您的描述太笼统,无法给出详细答案。然而,如果数据库有大量值或没有匹配的索引,并且需要回退到每个选择的全表扫描,那么即使是简单的语句也可能导致大量的数据库 Activity 。

所以,我的第一个建议是,您将 SQL studio 应用程序与 Activity 分析器一起使用。在那里您可以找到机器上的当前负载,更重要的是,可以找到“当前有值(value)的查询”列表。这些列表查询对当前 CPU 负载负有最大责任。您将看到经常执行的查询,但每次执行只花费很少的时间,并且您将看到只执行几次的查询,但执行成本极高。

然后,您可以评估来自 Java 应用程序的查询并获取优化提示。非常有帮助。

另一点是,如果查询无法优化,可能插入的数据处理起来很昂贵(例如 BLOB 对象),或者 sql server 不够强大,无法处理具有内存量和数据量的行数。其他应用程序同时运行。

如果您无法解决查询端的问题,您可能需要检查您的代码,是否可以通过在其间实现排队机制来限制数据库负载,或者是否需要实现缓存层。

关于java - 多线程java客户端会导致SQL Server 2008的CPU利用率高吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29316212/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com