0

你能帮我解决两个问题吗:

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

B. 这个表的写入发生在 200 个线程中,这些线程从连接池中获取连接并写入表,这个应用程序运行 24 到 7。是线程优先级有问题并停止来自 Web 应用程序的读取操作。

C. 我们可以只为该表进行主-主复制-因此写入发生在一张表中,写入发生在另一张表中,并且每两分钟数据从一张表迁移到另一张表?

请建议我。

提前致谢。

4

3 回答 3

0

在尝试任何太复杂的事情之前,不妨试试这个:

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

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

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

于 2012-04-22T15:35:58.753 回答
0

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

  1. 为传入的写入更新创建队列
  2. 创建一个 atomicXXX(参见 java.util.concurrency)以用作锁
  3. 创建一个线程池以从队列中读取并在取消锁定时执行更新
  4. 使用 javax.swing.Timer 定期设置锁和读取表数据。
于 2012-04-22T15:23:04.717 回答
0
  1. 检查连接池大小 - 也许它太小了,您的线程浪费时间等待来自池的连接。
  2. 检查您的数据库设置,如果您只是使用开箱即用的参数运行它,那么可能会有很好的改进空间。
  3. 您可能需要某种事件驱动系统——当车辆发送数据时,DB 不会更新,而是将消息添加到某个队列(例如 JMS)。然后,您的应用程序会在启动时缓存数据,并在收到此消息后更新缓存和数据库。关键是与 DB 交互的唯一组件是您的应用程序,并且数据仅在您收到事件时更改 - 因此您不需要查询 DB 来读取数据,而且您可以在后台进行更新线程等。有相当不错的开源消息系统(例如Apache Active MQ)和缓存库(例如EH Cache),因此您可以不费力气地构建合理的性能和容错系统。
  4. 我想引入消息传递将是一个严重的重新设计,因此解决您的直接问题复制可能是最好的解决方案 - 每 2 分钟将可更新表中的数据合并到另一个表,跟踪器将读取另一个表;如果您只读取网络应用程序中的数据而不更新它们,显然效果很好,否则您需要付出很多努力来保持 2 个表同步。一种变体是批处理——来自车辆的数据被插入到中间表中,然后每 2 分钟传输到主表中,读取器从中查询它们;中间表在转移后进行清洁。
于 2012-04-22T16:13:21.410 回答