【问题标题】:Web Application becomes very slow With Java使用 Java,Web 应用程序变得非常慢
【发布时间】:2012-04-22 07:55:11
【问题描述】:

我正在开发一个 Java 通信网关 (CGW),它从 GPS 设备获取数据包,对其进行处理并存储在一个名为 Live 表的表中(数据库在不同的服务器中运行 - 从 Java CGW 我通过连接调用数据库连接池并在 Live 表中插入数据)。

另一方面,我们的 Web 应用程序也在从同一个 Live 表中读取数据。因此,当 Java CGW 应用程序启动时,Web 应用程序变得非常非常慢,甚至第一页也打不开。我使用的是 SQL Server 2005。

请告诉我为什么会这样。

提前致谢。

【问题讨论】:

  • 好像是线程优先级的问题,也许你应该看看。
  • 该表可能已被 CGW 应用程序锁定。因此,查询会变慢。
  • @AmitBhargava - 如果它被锁定,我该如何解决
  • @JuanAlbertoLópezCavallotti - 我有 200 个线程一次从 hornetQ 获取数据,并使用 tomcat 连接池将其推送到具有最大 200 个活动连接的 Live 表,并且数据库位于不同的服务器中,所以我们怎么能得出结论是线程问题-因为我的 CGW 线程在不同的服务器上运行,并且只要求来自数据库服务器的连接。
  • @Anand 通常在我们的应用程序中,我们会在深夜进行批量更新。但是,这会导致数据过时的风险。 CGW 应用程序的运行频率是多少?

标签: java sql jakarta-ee tomcat


【解决方案1】:

看起来您的问题是线程优先级问题,因为读取/保存数据所需的处理器时间似乎比预期的要多,您可以通过在当前线程中调用小于 5 的 setPriority 来降低线程优先级。

获取当前线程。

Thread.currentThread().setPriority(MIN_PRIORITY);

要知道如何正确调用它,请查看Set Priority method.希望这会有所帮助!

【讨论】:

  • 但是我在运行我的 CGW 应用程序的不同服务器中调用 200 个线程,这些线程我曾经需要更多数据来处理 - 因为我们每分钟有 2000 个数据来自设备。对于通过连接池在最多 200 个连接的数据库服务器中进行插入/更新 - 请告诉我当我使用这 200 个线程从设备获取数据然后插入/更新到数据库时线程将如何影响操作。
  • 我可以认为您的数据收集过程会占用大量 CPU,并且当连接(来自 Web 服务器)进入以读取您正在收集的数据时,处理器对传入连接的重要性较低这就是使您的浏览速度变慢的原因。但也许我误解了你的架构。我知道您的收集过程是在另一台计算机上进行的,但如果不是来自网络连接,您将如何从中读取数据,对吧?
  • 我正在使用 HornetQ JMS 系统来存储来自设备的所有数据。 HornetQ 存储所有数据,我们通过 TCP 侦听器读取数据,然后存储在 HornetQ 中,同时我们有一个应用程序再次位于同一服务器中 - 我们同时从 hornetQ 的 200 个线程读取数据 - 每个线程在获取数据库后都会访问数据库连接池中的连接对象,然后在 Live 表中插入数据。所有 200 个线程都从连接池中获取数据库连接,并使用此连接对象将数据存储在活动表中,同时应用程序也只读取活动表。
  • 读写数据使用同一个连接池吗?也许您在等待池上释放连接以读取数据时在网络上等待很长时间。
  • 不,我正在使用 hornet 连接对象从 hornetQ JMS 系统读取数据。只有我使用数据库连接对象将数据插入数据库。和我们的 Web 应用程序同时从数据库中读取数据。
【解决方案2】:

您是否对数据库服务器进行了性能分析?可能是数据库服务器的工作量太大。如果 Web 应用程序只读取数据,主/从数据库配置应该可以解决 DB 服务器的工作量问题。

【讨论】:

  • 您能否简要解释一下-如何使用分析器以及如何制作主从架构,因为我们将数据存储在实时表中,同时我的用户试图通过 Web 应用程序访问他们的车辆,请建议我如何前进。
  • MySql 支持主/从,而且很容易设置。请参阅此处的参考文档:xorl.wordpress.com/2011/03/13/…
  • 我发现在我的SQLServer中超过150个连接处于挂起模式,这是使用更多数据库资源并阻塞某些东西的原因,如果挂起的连接更多会发生什么?它会影响数据库性能吗?
  • 这看起来是一个很可能的原因。您的数据库服务器应该有一个最大允许连接设置。如果您的所有连接都被您的写入过程占用,则 Web 服务器无法从数据库中获取数据。写入操作完成后是否正确关闭数据库连接?
  • 是的,我们正在正确地关闭连接,我想知道暂停的进程如何影响数据库性能以及严重程度。谢谢
【解决方案3】:

200 线程是一个具有挑战性的数字。

  • 什么是系统架构概述?
  • 所有这些线程消耗了多少内存。
  • 如何同步线程之间的数据/通信。
  • 什么是硬件配置。
  • 有必要使用SqlServer吗? jdbc:odbc 网桥可能比 jdbc:mysql 慢。

通常在多线程场景中,通信开销相对于参与代理呈指数增长。此外,数据的处理方式:多个数据的相同功能或多种数据类型的多个功能/阶段?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 2014-11-04
    • 2014-03-15
    • 2014-02-09
    • 2012-10-12
    相关资源
    最近更新 更多