【问题标题】:Fast multiple Insert on SQL server from different threads来自不同线程的 SQL 服务器上的快速多次插入
【发布时间】:2014-10-22 09:30:08
【问题描述】:

我有一个项目涉及记录来自多个设备(数千个)的数据 - 设备每 X 秒发送一次需要记录的数据。

设备向应用服务器 (Apache TomEE) 发送 HTTP GET 请求,服务器解析请求并将其存储到 SQL Server DB。

TomEE 服务器被复制了 3 次,并且有一个负载均衡器在它们之间循环请求。 我使用 OpenJPA 来存储记录,这样(em 保存需要存储的记录):

    EntityTransaction tx = em.getTransaction();
    try {
        tx.begin();
        u = execute(em);
        tx.commit();
    } catch (SQLException | RuntimeException e) {
        u = handleError(e);
        if (tx.isActive())
            tx.rollback();
    } finally {
        em.close();
    }

当我用 JMeter 测试性能时,我发现这个架构每秒处理大约 200 个请求 - 我想让它更快。 我想了一些方向:

  1. 在单个事务中插入多条记录可以提高性能,但是如何在单个事务中插入多条记录? (它们都来自不同的 HTTP 请求)
  2. 也许不同的 SQL 服务器配置可以提高性能?
  3. 也许 SQL Server 机器需要更多的 CPU/内存 - 我怎么知道这是否是瓶颈?
  4. 从业务逻辑的角度来看,事务可以并行编写 - 如何验证 SQL 服务器配置未设置为一对一模式?

有人可以考虑其他方向来改进这一点吗?

有人可以推荐找到瓶颈的方法吗?

谢谢!

【问题讨论】:

    标签: sql-server performance openjpa apache-tomee


    【解决方案1】:

    最好的方法是: 1)监视数据库并查看其负载(它是有限的,中间可以扩展而不是数据库)。 2) 在服务器上使用 jstack 或 kill -3 获取一些线程堆栈,看看会发生什么。如果不够,一些分析可以提供帮助,但我怀疑它在这里有用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-19
      • 1970-01-01
      • 1970-01-01
      • 2016-08-18
      相关资源
      最近更新 更多