2012-04-22 72 views
0

您可以帮我解决两个问题:使用java的应用程序的线程优先级

答:我们有一个表,其中读取和写入操作同时发生。写入发生得非常严重,所以读取速度非常慢 - 有时,由于此表上的繁重写入操作,我的Web应用程序不能启动。我怎么能处理这种情况。通过不同的Java应用程序进行写入,而通过我们的Web应用程序进行读取,因此Web应用程序变得非常慢任何想法?

B.写操作发生于该表通过发生200个线程,这些线程采取从连接池连接,并写入表格和7本的应用程序运行24线程的优先级是有问题,并从Web应用程序停止读操作。

下,我们可以有主 - 主复制该表only-这么写发生在一个表,写操作发生在其他表和一个表每两分数据迁移到另一个表?

请给我建议。

在此先感谢。

回答

0
  1. 检查连接池的大小 - 也许是太小了,你的线程浪费时间等待来自池连接。
  2. 检查您的数据库设置,如果您只是使用开箱即用的参数运行它,那么可能有一个很好的改进空间。
  3. 您可能需要某种事件驱动的系统 - 车辆发送数据时数据库未更新,但消息被添加到某个队列(例如JMS)。您的应用程序会在启动时缓存数据,并在收到此消息时更新缓存和数据库。关键是与数据库交互的唯一组件是您的应用程序,并且仅当您收到事件时才更改数据 - 因此您不需要查询数据库来读取数据,而且您可以只使用少量数据就可以在后台执行更新线程等。有相当不错的开源消息传递系统(例如Apache Active MQ)和缓存库(例如EH Cache),因此您可以在不费力的情况下构建合理的性能和容错系统。
  4. 我想引入消息传递将是一次严肃的重新设计,因此要解决您的即时问题,复制可能是最佳解决方案 - 每2分钟将数据从可更新表合并到另一个表,并且跟踪器将读取另一个表;如果你只是读取网络应用程序中的数据,而不更新它们,那么显然工作得很好,否则你需要付出很大的努力来保持2个表的同步。其中的一个变化就是批量 - 来自车辆的数据被送入中间表,然后每隔2分钟转入主表,供读者查询;转移后清洗中间表。
+0

我有两个独立的应用程序 - 一个应用程序在从HornetQ读取数据包后将数据写入数据库,这是在不同的服务器上运行,但只写入数据到也是独立的DB服务器。我们有一个独立的Web应用程序,可以从其他应用程序写入的同一张表中读取数据。所以我们有两个应用程序向DB查询同一个表,并且运行在不同服务器和数据库上的应用程序也都在不同的服务器中。我已经使用HornetQ消息系统,但是这个JMS系统存储来自设备的传入数据包。建议我 – geekIndiana 2012-04-22 16:30:55

+0

嗯,那么为什么2个应用呢?我将它们合并为一个,并将数据存储在Java缓存中,以便读者不会进入数据库。即使有2个应用 - 为什么200个作家?您可能受益于节流,使用更少的线程和更大的批次。角落案例是有一个线程运行循环,如:获取所有消息,将它们写入1个JDBC批处理,休眠一分钟,永久重复; 1线程,每分钟1次交易,有足够的时间让读者运行他们的查询。 – 2012-04-22 16:48:39

+0

我没有得到这个逻辑,你能否完全解释我。谢谢 – geekIndiana 2012-04-22 19:11:36

0

解决此问题的唯一方法是使用写入事件队列并定期停止写入,以便读者有机会。

  1. 创建传入的写入更新
  2. 队列创建atomicXXX(见java.util.concurrency)作为锁
  3. 创建一个线程池从队列中读取并执行更新时使用的锁定未设置
  4. 使用javax.swing.Timer定期设置锁定并读取表格数据。
+0

在我的情况下 - 我不能这样做 - 因为我需要向用户展示他们的车辆的实时细节,我们已经在车辆上安装了10,000个GPS设备,并且每个设备每2分钟发送一次数据,希望通过网络应用程序界面每两分钟跟踪一次所有车辆。所以我们需要在同一时间进行读写操作。请建议。 – geekIndiana 2012-04-22 15:33:23

+0

如果你的计时器设置为30或50毫秒,它将立即出现 – ControlAltDel 2012-04-22 15:51:22

+0

我没有找到你 – geekIndiana 2012-04-22 16:05:26

0

之前尝试任何太复杂试试这个也许是:

1)不要使用线程的优先级,他们很少你想要什么。

2)设置您自己的优先级方案,或许只需对读取和写入进行优先级读写的写入(优先级)队列。即:将读取和写入请求添加到单个队列,并将其阻塞或通知结果。

3)检查数据库功能,以优化写入重表

+0

我们不能一起读写操作,我们有一个应用程序写入数据库和另一个应用程序读取数据库。两者都是独立的tomcat应用程序 - 所以我如何构建一个优先队列来保持读写,需要建议 – geekIndiana 2012-04-22 16:04:49

+0

您可以让应用程序通过另一个应用程序或引入第三个应用程序。 – 2012-04-22 16:26:04

+0

你检查过你的数据库表/行锁定设置吗?例如在MySql中,我认为一些(大多数?)表默认为表锁定,如果您有很多写操作,这是非常糟糕的。锁定整个表...例如:http://dev.mysql.com/doc/refman/5.0/en/table-locking.html – 2012-04-22 16:27:41