【问题标题】:Improve performance of database access提高数据库访问的性能
【发布时间】:2012-06-19 13:10:36
【问题描述】:

我有一个在端口上侦听 UDP 数据报的应用程序。我使用 UDP 入站通道适配器侦听此端口。我的 UDP 通道适配器配置为使用 ThreadPoolTask​​Executor 来调度传入的 UDP 数据报。在 UDP 通道适配器之后,我使用直接通道。我的频道只有一个订阅者,即服务激活者。

该服务将传入消息添加到存储在内存中的同步列表中。然后,我有一个线程每 5 秒检索一次列表的内容,并对 MySQL 数据库进行批量更新。

我的问题:

  1. 第一批消息到达。我的 ThreadPoolExecutor 的线程从 UDP 通道适配器获取传入消息并将它们添加到同步列表中。假设已收到并插入 10000 条消息。
  2. 后台线程检索 10000 条消息并进行批量更新 (JdbcTemplate.update(String[])。
  3. 此时,后台线程等待来自数据库的响应。但是,现在,由于数据库执行 10000 条 INSERT 需要时间,因此已收到 20000 条消息并出现在列表中。
  4. 后台线程接收到来自数据库的响应。然后,它检索 20000 条消息并进行批量更新 (JdbcTemplate.update(String[])。
  5. 数据库执行 INSERT 需要更多时间,在此期间,已收到 35000 条消息并将其存储在列表中。

堆大小不断增长,并在一定时间后导致内存执行。

我正在努力寻找解决方案来提高我的应用程序的性能。

谢谢

【问题讨论】:

    标签: java performance asynchronous database-performance spring-integration


    【解决方案1】:

    每 5 秒存储 10,000 条记录对于任何数据库来说都是相当多的。

    您需要考虑其他选项

    • 使用不同的数据存储,例如 NoSQL 数据存储或平面文件。
    • 确保您的磁盘具有良好的写入性能,例如使用写入缓存。
    • 使用具有多个磁盘或 SSD 驱动器的磁盘子系统。

    【讨论】:

    • 请 DBA 调整/重新配置数据库,或在 SAN(或多磁盘配置)上使用散列随机文件(最终使用双路径)
    【解决方案2】:

    建议

    一个。你真的需要一个同步列表吗?你不能有一组列表,让我们说在这些列表之间划分工作,比如说通过在数据的键上运行 hashCode ?

    b.您可以使用从列表中读取信息的线程池(顺便说一下,我会在这里使用队列),这样,当一个线程由于大量的批量插入而“卡住”时,其他线程仍然可以读取“作业“从队列中执行它们?

    c。您的数据库是否与应用程序共同托管在同一台机器上?这可以提高性能

    d。你能发布你的插入查询吗?也许有人可以为您提供优化它的方法?

    【讨论】:

      【解决方案3】:

      使用数据库连接池,这样您就不必等待任何一个线程的提交。只需抓住下一个可用连接并进行并行插入。

      【讨论】:

      • 我了解您的解决方案,但我担心数据库的负载会太高(正如彼得所说)。
      • 那么这是一个架构问题。将数据库分布在更多磁盘上,以允许通过更多控制器通道对磁盘进行更多并行写入。 -- 对不起彼得,没有看到你上面的答案,所有的好建议
      • 最后一点建议,数据库通常会让您大吃一惊。虽然这是一个合理的假设,但在您尝试之前您不会真正知道。性能是关于不断解决下一个瓶颈。您的问题询问如何避免提交的延迟,并行写入就是答案。配置为处理它的数据库是一个不同的问题。
      【解决方案4】:

      我在 SQLServer 表上每秒获得 5.000 次插入,但这需要进行很多优化。没有使用以下所有提示,其中一些可能对您有用。

      • 查看 MySQL 插入速度文档提示 http://dev.mysql.com/doc/refman/5.0/en/insert-speed.html
      • 并行化插入过程
      • 尽可能聚合消息。不是存储所有消息,而是插入一行,其中包含有关在某个时间范围内接收到的消息、某种类型等的信息。
      • 将表更改为除主键外没有索引或外键
      • 切换到写入文本文件(如果您真的想在数据库中插入,则在夜间将其导入到 loaddata 批量文件插入中)
      • 使用单独的数据库实例只为您的表提供服务
      • ...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-09
        • 2010-10-22
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        • 2011-01-01
        • 2010-10-01
        • 1970-01-01
        相关资源
        最近更新 更多