使用java的应用程序的线程优先级

时间:2012-04-22 15:14:43

标签: java sql java-ee

你能帮我解决两个问题:

一个。我们有一个表,读和写操作同时发生。写入非常频繁,因此读取速度非常慢 - 有时我的Web应用程序由于此表上的大量写入操作而无法启动。我怎么能处理这种情况。通过我们的Web应用程序进行读取时,通过不同的Java应用程序进行写入,因此Web应用程序变得非有什么想法吗?

B中。这个表发生在200个线程上,这些线程从连接池中获取连接并写入表中,并且该应用程序运行24次,是线程优先级有问题并停止从Web应用程序执行读操作。

℃。我们是否可以仅为该表进行主 - 主复制 - 因此写入发生在一个表中并且写入发生在其他表中,并且每两分钟数据从一个表迁移到另一个表?

请建议我。

提前致谢。

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

在尝试任何过于复杂的事情之前,请尝试以下方法:

1)不要使用Thread优先级,它们很少是你想要的。

2)设置自己的优先级方案,可能只是通过为读取优先级的读取和写入设置(优先级)队列。即:将读取和写入请求添加到单个队列,并让它们阻止或通知结果。

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

答案 2 :(得分:0)

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