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

时间:2015-03-28 10:45:48

标签: java multithreading sql-server-2008 cpu-usage database-performance

我是Java开发人员,而不是DBA,并且想咨询 SQL Server 2008中的高CPU利用率 (不在Java应用服务器中)中遇到的问题< / em>的。

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

  1. 表X中每个选择/插入/更新(简单SQL语句)的40个线程 - 自动提交为ON
  2. 从表Y中选择/插入/更新(简单SQL语句)的10个线程,并从表X中选择(再次简单)(检查是否存在) - 自动提交为ON
  3. 两组线程池同时运行。每个线程被分配给“来自队列的消息”(文件),加载/读取其分配的“消息”,并插入/更新其对应的表。这两个线程池通过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池,可能是原因吗?如果是这样,我该如何证明这一点从DB的角度来看,即。 SQL服务器统计信息指向Java客户端的高容量线程?

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

2 个答案:

答案 0 :(得分:1)

您的描述过于通用,无法给出详细解答。然而,即使简单的语句也会导致大量的数据库活动,如果数据库有大量值或没有匹配的索引,并且需要回退到每个选择的全表扫描。

所以,我的第一个建议是,您将SQL studio应用程序与活动分析器一起使用。在那里,您将找到机器上的当前负载,更重要的是,“当前有价值的查询”列表。那些列表查询,负责当前CPU负载。您将看到经常执行的查询,但每次执行只需要很少的时间,您将看到只执行几次的查询,但执行起来非常昂贵。

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

另一点是,如果查询无法优化,可能插入的数据处理成本很高(例如BLOB对象),或者sql server的功能不足以处理内存量和行数的行数其他应用程序同时运行。

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

答案 1 :(得分:0)

线程数似乎很高,因为数据库必须序列化请求在某些时候vince数据区域仍然在磁盘上。我怀疑高loda是由你使用dB服务器掺杂的大量往返造成的。尝试将请求打包在orde中以最小化往返次数,并大大减少线程数。查询上的条件索引也可能是一个问题,但在这种情况下,eden会使磁盘过载。